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

[TestClass] public class MsProjectIntegration { const int? projectID = null; // The type 'int?' cannot be declared const // ... } 

为什么我不能拥有const int?

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

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

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

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

编辑:正如Eric Lippert指出的那样,这不是直截了当的。 例如, const decimal有效。

这个:

 private const decimal TheAnswer = 42; 

…编译(好,reflection器)到这个:

 [DecimalConstant(0, 0, (uint) 0, (uint) 0, (uint) 42)] private static readonly decimal TheAnswer; 

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是一个结构,上面的引用就是原因所在。

你不能有一个const引用类型(或结构),因此你不能有一个const int? 这实际上只是一个Nullable.

您可以将其标记为只读

 readonly int? projectID = null; 

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

你基本上是在说:

我有一个带有projectId字段的类,可能有也可能没有值,但实际上NEVER有一个值,它总是未定义的。

从逻辑的角度来看……声明本身毫无意义。

您可能需要考虑使用“readonly”修饰符。

const在编译时进行评估,而readonly在运行时强制执行。 复杂类型的实例无法编译到程序集中,因此必须在运行时创建。