1

我正在尝试定义一个通用类,它接受一个值类型(实际上它将是一个枚举)作为参数,并用它的默认类型初始化一个 const 字段。

我想要类似的东西:

public abstract class GenericClass<ValueType> 
    where ValueType: struct, IConvertible
{
  public const ValueType val = default(ValueType);
}

不幸的是,编译器抱怨(我使用的是 Mono,但我认为它在 .NET 上是一样的)。错误如下:

错误 CS1959:类型参数“ValueType”不能声明为 const

我的错误是什么?

4

2 回答 2

4

常量类型不允许使用类型参数。

因为 astruct无法制作const(来自C# 规范 10.4 常量

常量声明中指定的类型必须是sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, 枚举类型或引用类型。

此限制的一种解决方法是将其声明为static readonly.

public static readonly ValueType val = default(ValueType);
于 2013-07-23T17:57:35.500 回答
1

根据其在 MSDN 中的定义:常量表达式是可以在编译时完全评估的表达式。

根据this SO answer,引用本次采访

Anders Hejlsberg:[...] 在 CLR [公共语言运行时] 中,当您编译 List 或任何其他泛型类型时,它会像任何普通类型一样编译为 IL [中间语言] 和元数据。当然,IL 和元数据包含知道存在类型参数的附加信息,但原则上,泛型类型的编译方式与任何其他类型的编译方式相同。在运行时,当您的应用程序第一次引用 List 时,系统会查看是否有人已经请求 List。如果不是,它将向 JIT 提供 List 的 IL 和元数据以及类型参数 int。JITer,在JITing IL的过程中,也替代了类型参数。

因此,因为在编译时没有定义类型,所以直到运行时才能获得默认值。

于 2013-07-23T17:57:35.527 回答