C# Can';不要在类中声明常量字段

C# Can';不要在类中声明常量字段,c#,C#,请注意,我不是在问const、readonly和static之间的区别。我以为问题的内容很清楚,但显然我没能说清楚 我知道,当使用关键字const声明常量时,我必须在编译时指定一个值,并且该值必须是常量 下面的示例可以工作,但我发现有点长,不必要地放松了,所以我尝试将字段声明为常量。根据我的估计,我们确实有一个固定的内容规范,而且这些内容永远不会改变 static readonly List<int> Codes = new List<int> { 1337 }; 静态

请注意,我不是在问const、readonly和static之间的区别。我以为问题的内容很清楚,但显然我没能说清楚

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

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

static readonly List<int> Codes = new List<int> { 1337 };
静态只读列表代码=新列表{1337};
显然,根据计算机的说法,它不是,吹毛求疵的人也不会编译下面的例子。这与我的期望相矛盾,我不清楚计算机是如何计算的。于是问题来了——为什么它不喜欢它

const List<int> Codes = new List<int> { 1337 };
const List code=新列表{1337};

正如人们所期望的那样,确切的公式是:常量初始值设定项必须是编译时常量,但这就解释了错误的原因。它并没有真正解释非常量部分在哪里。

const
必须是
编译时的常量。如果你做了
newsomething()
,那就不是了。请参阅MSDN参考资料

但正如您所看到的,您可以将其声明为
static
,这不需要是一个常量值

现在,字段值必须是编译时常量
,这意味着它的值必须是已知的,并且在编译时是常量。但是,当您调用类的
构造函数时,实际对象将在
运行时创建,因此编译器不知道这一点

例如:

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

常量
必须是
编译时
常量。如果你做了
newsomething()
,那就不是了。请参阅MSDN参考资料

但正如您所看到的,您可以将其声明为
static
,这不需要是一个常量值

现在,字段值必须是编译时常量
,这意味着它的值必须是已知的,并且在编译时是常量。但是,当您调用类的
构造函数时,实际对象将在
运行时创建,因此编译器不知道这一点

例如:

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

const
必须是
编译时
常量,因为它的值将嵌入到发出的中间语言(IL)代码中

这里
新列表{1337}是在运行时运行的指令。编译器无法嵌入此
新列表{1337}中编写>而不运行代码来实际创建列表

有关更多信息:
常量
必须是
编译时
常量,因为它的值将嵌入到发出的中间语言(IL)代码中

这里
新列表{1337}是在运行时运行的指令。编译器无法嵌入此
新列表{1337}中编写>而不运行代码来实际创建列表

有关更多信息:

可能重复@AlphaMCubed Care,以指出链接指向我的问题的位置?我也可以用谷歌搜索“const vs readonly”,但这并不能让我理解我的困惑。也许我只是被意想不到的事情蒙蔽了双眼。据我所知,无论声明为常量的是什么,编译器只是用它的值替换对该变量的引用。我不认为列表可以这样做,因为列表的引用不会改变,但列表中的值不会改变。@GaneshR。你应该把它作为一个回答而不是评论。可能是@AlphaMCubed的重复。请指出链接指向我的问题的地方?我也可以用谷歌搜索“const vs readonly”,但这并不能让我理解我的困惑。也许我只是被意想不到的事情蒙蔽了双眼。据我所知,无论声明为常量的是什么,编译器只是用它的值替换对该变量的引用。我不认为列表可以这样做,因为列表的引用不会改变,但列表中的值不会改变。@GaneshR。你应该把这当作一个回答,而不是评论。我没有反驳你。我只是看不出它怎么不是常数——我们为数组分配了一个内存,它不会改变,也不会跨越更大或更小的内存块。怎样?!我太笨了,看不到+1对于闪电般的响应速度。添加了一些解释和示例,这有助于您理解吗?是的。再加上其他的评论/回复,我看到我的大脑在哪里出了问题。不过,我还不能接受你的答复。需要等几分钟。没关系,等一下,接受对你最有帮助的答案:)我没有反驳你。我只是看不出它怎么不是常数——我们为数组分配了一个内存,它不会改变,也不会跨越更大或更小的内存块。怎样?!我太笨了,看不到+1对于闪电般的响应速度。添加了一些解释和示例,这有助于您理解吗?是的。再加上其他的评论/回复,我看到我的大脑在哪里出了问题。不过,我还不能接受你的答复。需要等几分钟。没关系,等一下,接受对你最有帮助的答案:)