我被 csc 对这段代码的 react 难住了:
{
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??
}
}
在这段代码中,我得到了三个 if
和一个未初始化的局部变量 i。 CSC 足够聪明,可以容忍我在第一种和第二种情况下使用 i,因为它可以告诉代码无法访问正在使用 i 的位置。然而在第三种情况下,它提示 i 的增量“使用未分配的局部变量 i”。为什么它在前两个 ifs 中正确检测到 i 在无法访问的代码中,但在第三个 ifs 中却没有(这只不过是前两种情况的组合?
最佳答案
C# 5 规范的第 8.7.1 节对此进行了解释:
The first embedded statement of an
if
statement is reachable if theif
statement is reachable and the boolean expression does not have the constant valuefalse
.
尽管我们可以推断出这种情况:
false && i < 30
总是false
, 根据语言 (7.19) 的规则,它不是常量表达式,因此主体中的第一个嵌入语句是可达的。
并不是所有的事情都涉及&&
是非假的。这很好,例如:
if (false && true)
{
i++;
}
... 但是因为表达式 i < 30
不是恒定的,您的原始表达式不是恒定的。情况就是这样,即使我们知道表达式永远不会被求值。
语言可以决定任何&&
LHS 具有常量表达式 false
的表达式也是一个常量表达式,值为 false
,但事实并非如此。 (这只会增加少量的复杂性,但 yield 水平真的很小。)
关于C# 语句可达性和明确赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16500392/