我正在尝试定义一个泛型类,它接受一个值类型的参数(实际上它将是一个枚举)并用它的默认类型初始化一个const字段。
我想要类似的东西:
public abstract class GenericClass<ValueType>
where ValueType: struct, IConvertible
{
public const ValueType val = default(ValueType);
}
不幸的是编译器投诉(我使用的是Mono,但我认为它在.NET上是一样的)。错误如下:
错误CS1959:类型参数`ValueType'不能声明为const
我的错误是什么?
答案 0 :(得分:4)
常量类型不允许使用类型参数。
因为无法struct
const
(来自 C#规范10.4常量)
常量声明中指定的类型必须是
sbyte
,byte
,short
,ushort
,int
,uint
,{{ 1}},long
,ulong
,char
,float
,double
,decimal
,bool
,枚举类型,或参考类型。
此限制的一种解决方法是将其声明为string
static
。
readonly
答案 1 :(得分:1)
根据its definition in MSDN:常量表达式是一个可以在编译时完全评估的表达式。
根据this SO answer,引用this interview:
Anders Hejlsberg:[...]在CLR [公共语言运行时]中,当你 编译List或任何其他泛型类型,它编译为IL [中间语言]和元数据就像任何普通类型一样。 IL 和元数据包含知道有类型的附加信息 参数,当然,但原则上,泛型类型只是编译 任何其他类型编译的方式。在运行时,当你的 应用程序首次引用List,系统看起来如此 如果有人已经要求列表。如果没有,它就会输入JIT List的IL和元数据以及类型参数int。 JITer, 在JITing IL的过程中,也替换了类型参数。
因此,由于在编译时未定义类型,因此在运行时之前无法获取默认值。