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

时间:2009-12-02 15:18:32

标签: c# null const nullable

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

为什么我不能拥有const int?

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

5 个答案:

答案 0 :(得分:20)

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

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

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

编辑正如Eric Lippert指出的那样,这不是那么简单。例如,const decimal有效。

此:

private const decimal TheAnswer = 42;

...编译(好吧,反思者):

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

答案 1 :(得分:13)

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

  

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

     

因为类或结构是   在新的运行时初始化   关键字,而不是在编译时,你   无法为类或类设置常量   结构

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

答案 2 :(得分:8)

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

您可以将其标记为只读

readonly int? projectID = null;

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

你基本上是在说:

  

我有一个带有projectId字段的类   那可能有也可能没有价值,但是   事实上,从来没有价值,这是   总是未定义。

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