为什么这会编译?

B. *_*non 28 c# constants

我为我之前在代码中多次明确声明的值创建了一个"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.

  • @Jon:是的,我确实得到了警告消息,但我没有看到它,因为(至少在我设置VS的方式)它不会显示,除非我通过View |来明确地查找它.错误列表.至于"狡猾"的名字,我意识到这是一个有争议的话题,我当然尊重你的意见,但这是我所贬低的风格趋势之一,因为我发现当我扫描时,"shouty"命名法更容易理解码; IOW,shouty ==常量或"伪常量"(只读静态) (6认同)
  • @leppie:不适用于静态字段初始值设定项中的静态字段.术语"未分配变量"与静态字段无关,静态字段没有明确赋值的概念. (3认同)

Ani*_*dha 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
Run Code Online (Sandbox Code Playgroud)

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


tse*_*lls 5

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

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