为什么不能将nullables声明为const?

Sha*_*awn 14 c# null nullable const

[TestClass]
public class MsProjectIntegration {
    const int? projectID = null;
    // The type 'int?' cannot be declared const
    // ...
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能拥有const int?

编辑:我想要一个可空的int作为const的原因是因为我只是用它来从数据库加载一些示例数据.如果它为null我只是在运行时初始化样本数据.这是一个非常快速的测试项目,显然我可以使用0或-1,但int?感觉就像我想做的那样正确的数据结构.readonly似乎是要走的路

Tim*_*son 20

这不仅仅是毫无疑问的; 只能声明内置于运行时的类型const(从内存,它是bools,各种类型的int,浮点数/双精度数和字符串).

为什么?因为该值在编译时直接嵌入到程序集中,并且无法嵌入用户定义的类型.

但是,readonly关键字应该可以满足您的需求.相比之下const,任何readonly字段都在运行时而不是编译时初始化,因此可以使用或多或少的任何表达式初始化它们.

编辑:正如Eric Lippert指出的那样,这不是直截了当的.例如,const decimal工作.

这个:

private const decimal TheAnswer = 42;
Run Code Online (Sandbox Code Playgroud)

...编译(好,反射器)到这个:

[DecimalConstant(0, 0, (uint) 0, (uint) 0, (uint) 42)]
private static readonly decimal TheAnswer;
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的.首先:小数不是内置类型,但它们可以是const.第二:是的,有一些方法可以嵌入常量的用户定义类型; 我们*选择*不实现此功能.原则上它肯定是*可能的*.(证明:我们是为十进制做的.) (16认同)
  • 这就是stackoverflow如此糟糕的原因之一. (4认同)
  • 哈,当我问这个问题时,我并不期待来自c#编译团队的人的回复 (2认同)

Bla*_*son 13

http://en.csharp-online.net/const,_static_and_readonly

常量必须是整数类型(sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal,bool或string),枚举或null引用.

由于类或结构在运行时使用new关键字初始化,而不是在编译时,因此无法为类或结构设置常量.

由于nullable是一个结构,因此上述引用就是原因所在.


Bin*_*ier 8

你不能有一个const引用类型(或结构),因此你不能有一个const int?这真的只是一个Nullable<int>.

您可以将其标记为只读

readonly int? projectID = null;
Run Code Online (Sandbox Code Playgroud)

然后它不能在类构造函数之外修改.

  • `Nullable <T>`不是引用类型,而是结构.;) (4认同)