4

我被 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”的增量。为什么它在前两个 if 中正确检测到 i 在无法访问的代码中,但在第三个中没有(这只不过是前两种情况的组合?

4

1 回答 1

7

C# 5 规范的第 8.7.1 节对此进行了解释:

if如果if语句是可访问的并且布尔表达式不具有常量值,则该语句的第一个嵌入语句是可访问的false

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

false && i < 30

is always false,根据语言规则(7.19),它不是常量表达式,因此主体中的第一个嵌入语句是可达的。

并不是所有涉及的事情&&都是非虚假的。这很好,例如:

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

...但是因为表达式i < 30不是恒定的,所以您的原始表达式不是恒定的。即使我们知道表达式永远不会被求值,情况也是如此。

该语言可以确定&&LHS 具有常量表达式的任何表达式false也是具有 value 的常量表达式false,但事实并非如此。(这只会增加少量的复杂性,但收益水平确实很小。)

于 2013-05-11T18:29:21.003 回答