我无法理解以下代码的含义(部分原因,甚至是为什么编译)。
我们有以下代码段:
if (true) return;
{
... // Unreachable code detected
}
为什么这甚至编译?
我认为编译器在此构造中假定else
是正确的吗?如果没有,那么它是如何工作的?
我认为它必须在逻辑上等同于
if (true)
return;
else
{
...; // Unreachable code detected.
}
我有疑问,因为编译器似乎没有将以下内容解释为if-else
if (condition)
{
...
}
{
...
}
它确实编译,但无论如何都会执行第二个块。
这种行为是否在C#规范中明确说明了?
答案 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。你认为因为它是等价的,但实际上它不是别的。