C#语句可达性和明确赋值

我对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在前两个ifs中是无法访问的代码,而不是在第三个ifs中(这只是前两种情况的组合?

最佳答案
这可以通过C#5规范的第8.7.1节来解释:

The first embedded statement of an if statement is reachable if the if statement is reachable and the boolean expression does not have the constant value false.

即使我们可以推断出这种情况:

false && i < 30

总是假的,根据语言规则(7.19),它不是一个常量表达式,因此正文中的第一个嵌入语句是可达的.

并不是所有涉及&&是非虚假的.这很好,例如:

if (false && true)
{
    i++;
}

…但是因为表达式i< 30不是常数,你的原始表达式不是恒定的.即使我们知道表达式永远不会被评估,情况也是如此. 语言可以决定任何&& LHS具有常量false表达式的表达式也是值为false的常量表达式,但事实并非如此. (这只会增加一小部分复杂性,但效益水平确实很小.)

转载注明原文:C#语句可达性和明确赋值 - 代码日志