我为我之前在代码中多次明确声明的值创建了一个"const":
private static readonly int QUARTER_HOUR_COUNT = 96;
Run Code Online (Sandbox Code Playgroud)
当我为QUARTER_HOUR_COUNT搜索并替换96时,我无意中也替换了声明,因此它变为:
private static readonly int QUARTER_HOUR_COUNT = QUARTER_HOUR_COUNT;
Run Code Online (Sandbox Code Playgroud)
......但它编译了.我认为它会不允许这样做.为什么编译器接受它作为有效声明?
Jon*_*eet 23
我认为它会不允许这样做.为什么编译器接受它作为有效声明?
大概是因为语言规范允许它.您是否在语言规范中有一个您认为禁止它的特定规则?
如果你的问题真的是"为什么语言规范没有禁止这个" - 我怀疑这是因为你可能很难确定你只禁止你真正想禁止的事情,而实际上禁止所有这些事情.
你可以争辩说,对于直接回归自身的简单案例,在语言规范中有一个特殊情况会很好,但它会在语言中引入复杂性而收益相对较小.
请注意,即使您没有收到错误,我也希望您收到警告 - 如下所示:
Test.cs(3,33):警告CS1717:对同一变量进行分配; 你的意思是分配其他东西吗?
另请注意,如果您将其设置为const而不是仅仅是静态只读变量,那么您会收到编译时错误:
Test.cs(3,23):错误CS0110:对'Program.QUARTER_HOUR_COUNT'的常量值的评估涉及循环定义
另请注意,通过.NET命名约定,应该调用它QuarterHourCount,而不是使用SHOUTY_NAME.
代码生成的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
Run Code Online (Sandbox Code Playgroud)
由于QUARTER_HOUR_COUNT的默认值为0,因此将0分配给QUARTER_HOUR_COUNT