为什么这会编译

时间:2011-11-04 13:44:06

标签: c#

我无法理解以下代码的含义(部分原因,甚至是为什么编译)。

我们有以下代码段:

if (true) return;
{
    ... // Unreachable code detected
}

为什么这甚至编译?

我认为编译器在此构造中假定else是正确的吗?如果没有,那么它是如何工作的?

我认为它必须在逻辑上等同于

if (true) 
    return;
else
{
    ...; // Unreachable code detected.
}

我有疑问,因为编译器似乎没有将以下内容解释为if-else

if (condition) 
{
    ...
}
{
    ...
}

它确实编译,但无论如何都会执行第二个块。

这种行为是否在C#规范中明确说明了?

7 个答案:

答案 0 :(得分:3)

这里不假设else,它只是形式的任何代码:

if(condition)
{
    code A

    return;
}

code B

在逻辑上等同于:

if(condition)
{
    code A

    return;
}
else
{
    code B
}

如果code B评估为false,则只会到达condition

您的混淆也可能来自于一个没有关键字的代码块。

code A

{
    code B
}

这是完全合法的;代码块不需要控制流关键字,您可以将代码嵌套在大括号中的任何位置。虽然它并不常见,但它是合法的。请注意,它确实在您的代码中创建了一个新的变量作用域,并且(就像所有其他代码块一样)这些块之外的代码将无法访问块中声明的任何变量。

例如:

code A

{
    int foo = 10;

    code B
}

int bar = foo; // compiler error, as foo is not a variable within this scope

虽然不可取,但你可以用它来声明两个同名但不同的变量:

{
    int foo = 10;

    code A
}
{
    string foo = "bar";

    code B
}

答案 1 :(得分:3)

您的困惑来自于您可以在任意{ }中包含任何内容。例如:

{
    Console.WriteLine(a);
    {
        a = 6;
    }
}
{
    Console.WriteLine(a);
}

这是完全有效的,所有花括号都毫无意义。但仍然有效!

答案 2 :(得分:3)

if (true) return;
{
    ... // Unreachable code detected. WTF?
}

相当于

if (true) 
    return;   
 ... // Unreachable code 

没有其他暗示。

答案 3 :(得分:1)

评论中的答案:

if (true) return;
// whatever is after the previous statement will never be executed
// because the previous statement will always return
{
    // this is not automatically added to the "else" part of the previous if
    // this is just a code block with additional braces, which are not 
    // required but valid.
}

答案 4 :(得分:0)

return之后的代码无法访问。条件true总是错误的true

答案 5 :(得分:0)

这是一个逻辑问题,而不是语法问题。因此编译器不会发现它。

至于你的第三个例子,它打破了(大多数)(大多数)编程语言的规则,因此编译器会发现它并抛出错误。

答案 6 :(得分:0)

没有。 ';'在你的if之后没有关闭truepart。它会关闭所有if。所以后面的块是可达代码。如果您的第一次测试失败。编译器没有引入else。你认为因为它是等价的,但实际上它不是别的。