GoTo在"if"分支内部



我有一个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(实际上,停止使用它(用于退出切换语句或循环,其中包含一个Labeled Statement,以避免不需要的代码

如@LanceU所述。马修斯,跳跃是不允许的。

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

错误消息似乎回答了这个问题:不,您不能转到从当前作用域无法访问的标签。具体说明甚至更明确:";。。。如果goto语句不在标签的范围内,则会发生编译时错误。此规则允许使用goto语句将控制权转移到嵌套作用域之外,但不能转移到嵌套范围中">

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

最新更新