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

时间:2013-05-11 18:26:13

标签: 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??
  }
}

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

1 个答案:

答案 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的常量表达式,但是它没有。 (这只会增加一小部分复杂性,但效益水平真的很小。)