请注意,我并未询问 const , readonly 和 static 之间的区别。我认为从问题的内容中可以清楚地看出,但显然我没有成功地说明这一点。
我知道在使用关键字 const 声明常量时,我必须在编译时指定一个值,并且该值必须是......,常量。
以下示例有效,但我发现有点冗长且不必要地放松,所以我试图将该字段声明为常量。根据我的估计,我们确实对内容有一个不断的规范,而且这些内容永远不会改变。
static readonly List<int> Codes = new List<int> { 1337 };
显然,根据计算机它不是,并且挑选者不会编译以下示例。这与我的期望相矛盾,而且我不清楚计算机是如何计算的。因此,问题 - 为什么它不喜欢它?
const List<int> Codes = new List<int> { 1337 };
确切的表述是,正如人们所期望的那样:常量初始化程序必须是编译时常量,但它会回答错误的原因。它并没有真正解释在哪里是非常数部分。
答案 0 :(得分:3)
const
必须compile-time
不变,因为其值将嵌入在已发出的中间语言(IL)代码中。
此处new List<int> { 1337 };
是在运行时下运行的指令。编译器无法在IL 中嵌入此new List<int> { 1337 };
而无需运行代码来实际创建列表。
了解更多信息: How to stop C# from replacing const variable with their values?
答案 1 :(得分:2)
const
必须compile-time
不变。如果你做new Something()
那不是。请参阅MSDN参考here。
但是您可以将其声明为static
,如您所见,它不必是常数值。
现在,字段值必须为compile-time-constant
,这意味着它的值必须是已知的并且在编译时本身是常量。但是当你调用类的constructor
时,实际的对象将在run-time
创建,因此编译器不知道。
示例:
const string Allowed = "hello!";
const string NotAllowed = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });