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

Mis*_*hax 4 c# variable-assignment

我对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??
  }
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我有三个ifs和一个未初始化的局部变量i.CSC非常聪明,可以容忍我在第一和第二种情况下使用i,因为它可以告诉代码我在哪里使用是无法访问的.然而在第三种情况下,它抱怨i"使用未分配的局部变量i"的增量.为什么正确检测到i在前两个ifs中是无法访问的代码,而不是在第三个ifs中(这只是前两种情况的组合?

Jon*_*eet 7

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

if如果if语句可达且布尔表达式没有常量值,则可以访问语句的第一个嵌入语句false.

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

false && i < 30
Run Code Online (Sandbox Code Playgroud)

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

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

if (false && true)
{
    i++;
}
Run Code Online (Sandbox Code Playgroud)

...但因为表达式i < 30不是常数,所以原始表达式不是常数.即使我们知道表达式永远不会被评估,情况也是如此.

语言可以决定&&LHS具有常量表达式的任何表达式false也是值的常量表达式false,但事实并非如此.(这只会增加一小部分复杂性,但效益水平确实很小.)