2009-12-02 88 views
13
[TestClass] 
public class MsProjectIntegration { 
    const int? projectID = null; 
    // The type 'int?' cannot be declared const 
    // ... 
} 

为什么我不能有const int?为什么不能将可空值声明为const?

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

+12

最佳做法:仅对所有永恒*的逻辑常数为*的事物使用常量。好:猫王出生的一年中有十几件物品,铅的原子序数。不好:版本号 - 它们从版本变为版本;变化的东西不应该是常数。可怕的是:目前的日元兑欧元汇率;每秒都在变化。 – 2009-12-02 15:48:19

+0

是的,我基本上只是使用它作为一个特设的配置文件,绝对不是最佳做法 – Shawn 2009-12-02 15:59:31

+0

如果这不是“是的,我基本上......” 2009-12-02 16:34:40

回答

19

这不只是可以空谈;只有运行时内置的类型可以被声明为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; 
+0

谢谢,组装部分是有启发性的,并使这是最好的答案(对我) – Shawn 2009-12-02 15:36:42

+1

+1只为了解释 – 2009-12-02 15:37:46

+14

这是不正确的。首先:小数不是内置类型,但可以是const。第二:是的,有一些方法可以嵌入常用的用户定义类型;我们*选择*不实现此功能。原则上这当然是可能的。 (证明:我们做了十进制。) – 2009-12-02 15:44:20

13

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

常量必须是整数类型的 (为sbyte,字节,短,USHORT,INT, UINT,长,ULONG,char和float, 双,decimal,bool或string),枚举或对null的引用。

由于类或结构 初始化在运行时与新 的关键字,而不是在编译的时候,你 不能设置固定类或 结构。

由于nullable是一个结构体,因此上面的引用是原因。

8

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

你可以把它标记为只读

readonly int? projectID = null; 

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

+4

'Nullable '不是一个引用类型,而是一个结构体。 ;) – Lucero 2009-12-02 15:25:53

+0

Lucero是正确的:http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx – 2009-12-02 15:28:51

+0

你当然都是正确的。答案已经修改。 – 2009-12-02 15:34:55

3

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

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

+3

'Nullable '不是一个引用类型,而是一个结构体。 ;) – Lucero 2009-12-02 15:26:23

+0

废话,我的坏。固定。 – 2009-12-02 19:47:37

3

你基本上说:

我有一个专案编号字段 一类,可能会或可能不会有一个价值,但 在事实上从来没有一个值,它是 总是未定义。

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

+0

,因为它的配置设置可能为空,我宁愿不编码魔术数字....说-1 – Shawn 2009-12-02 15:34:03

+0

如果projectId是“常量”,你不能从数据库中加载任何东西......其实你几乎不能做任何事情。 – 2009-12-02 15:42:45

+0

这是主键 – Shawn 2009-12-02 15:46:56

相关问题