C# 为什么可以';不能将空值声明为常量吗?

C# 为什么可以';不能将空值声明为常量吗?,c#,null,constants,nullable,C#,Null,Constants,Nullable,为什么我不能有一个常量int? Edit:我想要一个可为null的int作为常量的原因是,我只是用它从数据库加载一些示例数据。如果它为空,我只是想在运行时初始化样本数据。这是一个非常快速的测试项目,显然我可以使用0或-1,但是int?感觉就像是我想要做的事情的正确数据结构。只读似乎是一条出路 常数必须是整数类型 (sbyte,byte,short,ushort,int, uint、long、ulong、char、float、, 双精度、十进制、布尔值或字符串),以及 枚举,或对null的引用 因

为什么我不能有一个
常量int?

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

常数必须是整数类型 (sbyte,byte,short,ushort,int, uint、long、ulong、char、float、, 双精度、十进制、布尔值或字符串),以及 枚举,或对null的引用

因为类或结构是 在运行时使用新的 关键字,而不是在编译时 无法将常量设置为类或 结构


由于nullable是一个结构,所以上面的引号就是原因。

您不能拥有常量引用类型(或结构),因此您不能拥有常量int?这实际上只是一个可为空的

您可以将其标记为只读

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

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

您可能想考虑使用“只读”修饰符来代替。
const
s在编译时计算,而
readonly
s在运行时强制执行。复杂类型的实例无法编译到程序集中,因此必须在运行时创建。

它不仅仅是可空的;只有内置到运行时中的类型才能声明为
const
(从内存中,它是bools、各种类型的int、float/double和string)

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

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

编辑:正如Eric Lippert指出的,这并不是那么简单。例如,
const decimal
起作用

这:

…编译(嗯,反射器)为:


你基本上是说:

我有一个带有投影域的类 它可能有值,也可能没有值,但是 事实上,它从来没有价值,它是 总是未定义的


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

可空的
不是引用类型,而是一个结构
Nullable
不是引用类型,而是一个结构因为它是一个配置设置,可能是空的,我不希望代码围绕一个神奇的数字。。。。假设-1如果projectId为“const”,则无法从数据库向其中加载任何内容。。。事实上,您几乎不能用它做任何事情。主键怎么可能为null?var project=projectd.HasValue?Project.GetProjectByID(projectID.Value,connectionString):新项目();当然有道理。例如,在使用DataRowAttribute的单元测试中。我想声明我的测试数据,比如private const int?NullStudentId=null;private const int ZeroStudentId=0;私有常量int ValidStudentId=100;然后在[DataRow]中使用我的常量(不能使用只读必须是常量),如[DataRow[NullStudentId][DataRow(ZeroStudentId)][DataRow(ValidStudentId)]不幸的是,我不能这样做。我需要使用null而不是NullStudentId。这是const int?的一个有效用法。谢谢,汇编部分很有启发性,这是最好的答案(对我来说)这是不正确的。第一:小数不是内置类型,但它们可以是常量。第二:是的,有一些方法可以嵌入常量用户定义类型;我们选择不实现此功能。原则上这当然是可能的。(证明:我们是为十进制而做的。)哈,当我问这个问题时,我没想到c#编译器团队会有人回应这就是为什么stackoverflow如此糟糕的原因之一。有人想知道是什么让“allowed as const”中的项成为列表非常特殊;除了字符串之外的其他不可变类型应该完全可以用作常量,如Color和DateTime;毕竟,这两种类型基本上也只是围绕裸int的包装(分别是Int32和Int64).我真的想不出哪种情况需要一个值为空的常数。你能告诉我吗?最佳实践:只对逻辑上永远不变的事物使用常数。好:一打中的项目数,猫王出生的年份,铅的原子序数。坏:版本号--它们从版本t变为版本号o版本;变化的东西不应该是常数。糟糕的是:当前日元对欧元的汇率;每秒都在变化。是的,我基本上只是把它用作一个临时配置文件,绝对不是最佳实践不应该是“是的!我基本上是…”
readonly int? projectID = null;
private const decimal TheAnswer = 42;
[DecimalConstant(0, 0, (uint) 0, (uint) 0, (uint) 42)]
private static readonly decimal TheAnswer;