繁体   English   中英

无法在类中声明const字段

[英]Can't declare const field in class

请注意,我并不是在问constreadonlystatic之间的区别。 我认为从问题的内容来看是很清楚的,但是显然我没有足够清楚地说明这一点。

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

以下示例有效,但我发现它有点冗长且不必要地放松,因此我尝试将字段声明为constant 据我估计,我们对内容确实有一个固定的说明,并且这些内容永远都不会改变。

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

显然,根据计算机,不是,并且nit-picker无法编译以下示例。 这与我的预期相矛盾,我对计算机的数字还不清楚。 因此,问题-为什么不喜欢呢?

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

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

const必须是compile-time时常量,因为其值将嵌入在发出的中间语言(IL)代码中

这里是new List<int> { 1337 }; 是在运行时运行的指令。 编译器无法嵌入此new List<int> { 1337 }; 在IL中不运行代码实际创建列表

有关更多信息: 如何阻止C#用其值替换const变量?

const必须是compile-time时常量。 如果执行new Something()则不会。 请参阅此处的 MSDN参考。

但是您可以像看到的那样将其声明为static ,而不必为常数。

现在,字段值必须是compile-time-constant意味着它的值必须是已知的,并且在编译时本身是恒定的。 但是,当您调用类的constructor时,实际对象将在run-time创建,因此编译器不知道。

例:

const string Allowed = "hello!";
const string NotAllowed = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM