我为我之前在代码中多次明确声明的值创建了一个“const”:
private static readonly int QUARTER_HOUR_COUNT = 96;
当我为QUARTER_HOUR_COUNT搜索并替换96时,我无意中也替换了声明,因此它变为:
private static readonly int QUARTER_HOUR_COUNT = QUARTER_HOUR_COUNT;
......但它编译了。我认为它会不允许这样做。为什么编译器接受它作为有效声明?
答案 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
,只有值类型具有默认值。