如何声明作为泛型参数提供的泛型值类型的const字段

时间:2013-07-23 17:54:20

标签: c# generics enums value-type

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

我想要类似的东西:

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

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

  

错误CS1959:类型参数`ValueType'不能声明为const

我的错误是什么?

2 个答案:

答案 0 :(得分:4)

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

因为无法struct const(来自 C#规范10.4常量

  

常量声明中指定的类型必须是sbytebyteshortushortintuint,{{ 1}},longulongcharfloatdoubledecimalbool,枚举类型,或参考类型。

此限制的一种解决方法是将其声明为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的过程中,也替换了类型参数。

因此,由于在编译时未定义类型,因此在运行时之前无法获取默认值。