【发布时间】:2013-05-11 18:26:12
【问题描述】:
我被 csc 对这段代码的反应难住了:
{
int i;
if (false)
{
i++; // uninitialized, but allowed by compiler
}
if (false && i < 30) // uninitialized, but allowed by compiler
{
}
if (false && i < 30) // uninitialized, but allowed by compiler
{
i++; // NOT ALLOWED by compiler??
}
}
在这段代码中,我有三个ifs 和一个未初始化的局部变量 i。 CSC 足够聪明,可以容忍我在第一种和第二种情况下使用 i,因为它可以告诉代码在哪里使用 i 是不可访问的。然而在第三种情况下,它抱怨 i“使用未分配的局部变量 i”的增量。为什么它在前两个 if 中正确检测到 i 在无法访问的代码中,但在第三个中没有(这只不过是前两种情况的组合?
【问题讨论】:
-
这个问题真的不是关于明确的分配——而是关于可达性。
-
你从哪里得到未初始化的? int 是一个值类型,所以它被初始化为零。
-
@TonyHopkinson i 是一个局部变量,这些不会为您自动初始化!至于我从哪里得到它,是编译器给了我这个错误!
-
是的,所有值类型都在 .net 中初始化。阅读 CLR
-
@TonyHopkinson 我不知道如何将您的评论与这种情况联系起来,以下语句序列,在一个方法中,不编译: int kk;Console.WriteLine(kk);这不是 CLR 问题,而是 C# 问题