我对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??
}
}
在这段代码中,我有三个if
和一个未初始化的局部变量i。 CSC非常聪明,可以容忍我在第一和第二种情况下使用i,因为它可以告诉代码我在哪里使用是无法访问的。然而在第三种情况下,它抱怨i“使用未分配的局部变量i”的增量。为什么正确检测i在前两个ifs中是无法访问的代码,而不是在第三个ifs中(这只是前两种情况的组合?
答案 0 :(得分:7)
这由C#5规范的第8.7.1节解释:
如果
if
语句可以访问且布尔表达式没有常量值if
,则可以访问false
语句的第一个嵌入语句。
即使我们可以推断出这种情况:
false && i < 30
始终为false
,根据语言规则(7.19),它不是常量表达式,因此正文中的第一个嵌入语句是可到达的。
并非涉及&&
的所有内容都是非假的。这很好,例如:
if (false && true)
{
i++;
}
...但由于表达式i < 30
不是常量,因此原始表达式不是常量。这就是的情况,即使我们知道表达式永远不会被评估。
语言可以决定LHS具有&&
常量表达式的任何false
表达式也是值为false
的常量表达式,但是它没有。 (这只会增加一小部分复杂性,但效益水平真的很小。)