无法在类中声明const字段

时间:2015-10-11 09:46:26

标签: c#

请注意,我并未询问 const readonly static 之间的区别。我认为从问题的内容中可以清楚地看出,但显然我没有成功地说明这一点。

我知道在使用关键字 const 声明常量时,我​​必须在编译时指定一个值,并且该值必须是......,常量。

以下示例有效,但我发现有点冗长且不必要地放松,所以我试图将该字段声明为常量。根据我的估计,我们确实对内容有一个不断的规范,而且这些内容永远不会改变。

static readonly List<int> Codes = new List<int> { 1337 };

显然,根据计算机它不是,并且挑选者不会编译以下示例。这与我的期望相矛盾,而且我不清楚计算机是如何计算的。因此,问题 - 为什么它不喜欢它?

const List<int> Codes = new List<int> { 1337 };

确切的表述是,正如人们所期望的那样:常量初始化程序必须是编译时常量,但它会回答错误的原因。它并没有真正解释在哪里是非常数部分

2 个答案:

答案 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' });