不能在类中声明const字段

本文关键字:const 字段 声明 不能 | 更新日期: 2023-09-27 18:17:03

请注意,我不是在问constreadonlystatic之间的区别。我以为从题目的内容可以清楚地看出这一点,但显然我没有做到足够清楚。

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

下面的示例可以工作,但是我发现它有点冗长和不必要的放松,所以我尝试将字段声明为常量。根据我的估计,我们确实有一个固定的内容规格,这些规格是永远不会改变的。

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

显然,根据计算机,它不是,并且挑剔器不会编译下面的示例。这与我的预期相矛盾,我不清楚计算机是如何计算的。因此问题来了——为什么它不喜欢它?

const List<int> Codes = new List<int> { 1337 };
确切的公式是,正如人们所期望的那样:常量初始化式必须是编译时常量,但这回答了为什么会出现错误。它并不能解释非常数部分在哪里

不能在类中声明const字段

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