我有一个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
的内容(是一个非常巧妙的开箱即用的想法。