为什么这会编译?

时间:2012-08-15 16:25:09

标签: c# constants

我为我之前在代码中多次明确声明的值创建了一个“const”:

private static readonly int QUARTER_HOUR_COUNT = 96;

当我为QUARTER_HOUR_COUNT搜索并替换96时,我无意中也替换了声明,因此它变为:

private static readonly int QUARTER_HOUR_COUNT = QUARTER_HOUR_COUNT;

......但它编译了。我认为它会不允许这样做。为什么编译器接受它作为有效声明?

5 个答案:

答案 0 :(得分:23)

  

我认为不会这样做。为什么编译器接受它作为有效声明?

大概是因为语言规范允许它。您是否在语言规范中有一个您认为禁止它的特定规则?

如果你的问题真的是"为什么语言规范不禁止这个" - 我怀疑它是因为它可能很难确保你禁止你真正想禁止的事情,而实际上禁止所有这些事情。

你可以说,对于简单直接赋值给自己的情况,在语言规范中有一个特殊情况会很好,但它会为的语言带来复杂性相对收益不大。

请注意,即使您没有收到错误,我也希望您收到警告 - 如下所示:

  

Test.cs(3,33):警告CS1717:对同一变量作出的分配;你的意思是分配其他东西吗?

另请注意,如果您将其设为const而不仅仅是静态只读变量,那么会出现编译时错误:

  

Test.cs(3,23):错误CS0110:评估' Program.QUARTER_HOUR_COUNT'的常数值。涉及循环定义

另请注意,通过.NET命名约定,这应该被称为QuarterHourCount,而不是拥有SHOUTY_NAME。

答案 1 :(得分:6)

代码生成的IL代码如下:

 IL_0007:  ldsfld     int32 Example.Quat::QUARTER_HOUR_COUNT//Load the value of a static field on the stack
 IL_000c:  stsfld     int32 Example.Quat::QUARTER_HOUR_COUNT// Store the value from the stack in the static field

由于QUARTER_HOUR_COUNT的默认值为0,因此将0分配给QUARTER_HOUR_COUNT

答案 2 :(得分:5)

因为变量初始化为0然后设置为自身。

我的猜测是它会在设置为自己之前做一个新的Int(),将其初始化为零。

答案 3 :(得分:4)

因为编译器会破坏这一行:

private static readonly int QUARTER_HOUR_COUNT = QUARTER_HOUR_COUNT;

基本上是IL的等价物:

private static readonly int QUARTER_HOUR_COUNT;
QUARTER_HOUR_COUNT = QUARTER_HOUR_COUNT;

然后很明显,这也会被打破,但上述内容应足以说明我的观点。

从技术上讲,它在使用时的默认值为零。

答案 4 :(得分:0)

正如其他人隐含的值类型(如int)具有默认值所以声明变量而不显式初始化意味着它仍然具有值。

你可以找到任何类型的默认值:

int i = default(int);

或更一般地说:

T t = default(T);

请注意,对于引用类型,默认值为null,只有值类型具有默认值。