28

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

private static readonly int QUARTER_HOUR_COUNT = 96;

当我对 QUARTER_HOUR_COUNT 进行 96 的搜索和替换时,我无意中也替换了声明,所以它变成了:

private static readonly int QUARTER_HOUR_COUNT = QUARTER_HOUR_COUNT;

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

4

5 回答 5

23

我认为这将不允许这样做。为什么它被编译器接受为有效声明?

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

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

您可能会争辩说,对于直接赋值给自身的简单情况,最好在语言规范中有一个特殊情况,但它会在语言中引入复杂性,而收益相对较小。

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

Test.cs(3,33):警告 CS1717:对同一变量进行赋值;你的意思是分配别的东西吗?

另请注意,如果您将其设为 aconst而不仅仅是静态只读变量,那么您确实会收到编译时错误:

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

另请注意,根据 .NET 命名约定,应该调用QuarterHourCount它,而不是使用 SHOUTY_NAME。

于 2012-08-15T16:27:34.657 回答
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

于 2012-08-15T17:01:55.427 回答
5

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

我的猜测是它会在设置为自身之前执行一个 new Int() ,这会将其初始化为零。

于 2012-08-15T16:27:33.930 回答
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;

然后显然这也会被更多地分解,但以上应该足以说明我的观点。

所以从技术上讲,它在使用时会以默认值零存在。

于 2012-08-15T16:29:33.647 回答
0

由于其他人具有隐含的值类型,例如int具有默认值,因此在没有显式初始化的情况下声明变量意味着它仍然具有值。

您可以找到任何类型的默认值,如下所示:

int i = default(int);

或更一般地说:

T t = default(T);

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

于 2012-08-15T16:58:01.430 回答