GoTo inside `if` 分支?

GoTo inside `if` branching?

我有一个 goto 问题:是否可以转到本地范围内的标签? 以下代码找不到 InsideTrue 标签:

goto InsideTrue; // error CS0159: No such label 'InsideTrue' within the scope of the goto statement
if (true)
{
    InsideTrue:
    Console.WriteLine("true");
    goto OutsideIf;
}
else
{
    InsideFalse:
    Console.WriteLine("false");
    goto OutsideIf;
}
OutsideIf:

我想用它作为一个特殊的分支案例来绕过某些情况下的 if/else 检查,我怎样才能做到这一点而不重新编译?

这太可怕了,但是为了娱乐大家,您可以将 if/else 中的代码提取到其他标签中:

goto InsideTrue;
if (true)
{
    goto InsideTrue;
}
else
{
    goto InsideFalse;
}
InsideTrue:
Console.WriteLine("true");
goto OutsideIf;
InsideFalse:
Console.WriteLine("false");
OutsideIf:

首先你不应该使用它,但其他人已经说过了,所以我不会详细说明。

您遇到的第二个问题是 InsideTrue 声明在第一行超出了范围。这是因为它还没有在你的代码的这个位置声明。

您将不得不重新考虑您的代码以从 if 中声明 InsideTrue(我知道这是您想要的,但不能那样做),因为在运行时没有办法知道你是否要进入 if,阻止 InsideTrue 的声明,直到你进入它。

Goto(真的,停止使用它)用于退出 switch 语句或在其外部带有标签语句的循环,以避免不需要的代码

如@LanceU.Matthews所述,不允许跳转。

我在这里引用他们的回答:

The error message would seem to answer the question: No, you cannot goto a label that is not reachable from the current scope. The specifiation is even more definitive: "... if the goto statement is not within the scope of the label, a compile-time error occurs. This rule permits the use of a goto statement to transfer control out of a nested scope, but not into a nested scope."

感谢您的回答,重构(通过 butch.. 提取 if 的内容)是一个非常巧妙的开箱即用的想法。