不能在类中声明const字段
本文关键字:const 字段 声明 不能 | 更新日期: 2023-09-27 18:17:03
请注意,我不是在问const、readonly和static之间的区别。我以为从题目的内容可以清楚地看出这一点,但显然我没有做到足够清楚。
我知道,当使用关键字const声明常量时,我必须在编译时指定一个值,该值需要是,嗯……,常数。
下面的示例可以工作,但是我发现它有点冗长和不必要的放松,所以我尝试将字段声明为常量。根据我的估计,我们确实有一个固定的内容规格,这些规格是永远不会改变的。
static readonly List<int> Codes = new List<int> { 1337 };
显然,根据计算机,它不是,并且挑剔器不会编译下面的示例。这与我的预期相矛盾,我不清楚计算机是如何计算的。因此问题来了——为什么它不喜欢它?
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' });