在研究了退出嵌套循环的方法后,我决定尝试使用
goto
,
private void example()
{
for (int i = 0; i < 100; i++)
{
for (int ii = 0; ii < 100; ii++)
{
for (int iii = 0; iii < 100; iii++)
{
goto exitMethod;
}
}
}
exitMethod:
}
但是由于某种原因,如果我将
goto
标签放在方法的最后,Visual Studio 2012(Ultimate)会抱怨(并且它不会编译),
但是如果我将代码更改为这样,
private void example()
{
for (int i = 0; i < 100; i++)
{
for (int ii = 0; ii < 100; ii++)
{
for (int iii = 0; iii < 100; iii++)
{
goto exitMethod;
}
}
}
exitMethod:
int someUnneededVariable; // Just an example, if I add ANY piece of code the error vanishes.
}
没有出现任何错误(并且可以编译);我搜索了我所知道的所有 MSDN 参考文献,但找不到任何与此相关的内容。
我知道我可以通过使用
return;
轻松解决这个问题;即使如此,我仍然想找出导致此错误的原因。
标签本身并不存在:它标记一个语句。来自 C# 5 规范第 8.4 节:
带标签的语句允许语句以标签为前缀。块中允许带标签的语句,但不允许作为嵌入语句。
在这种情况下,您将在方法末尾应用标签 - 没有声明它是标签 for。所以编译器拒绝你的代码是绝对正确的。
如果您确实愿意,您可以向原本多余的返回语句添加标签:
exitMethod:
return;
}
...或者只是一个空洞的陈述,正如 Irfan 所建议的那样。但必须有 a 声明。
但我不会推荐它。只需将任何
goto exitMethod;
语句更改为简单的 return
。
您可以放置空白声明。
尝试:
exitMethod: ;
但是无论如何,如果你真的想从当前方法返回,请使用 return 语句。 如果方法具有除 void 之外的其他返回类型,
return (type);
否则
return;
在这种情况下
goto exitMethod;
相当于普通
return;
而且该计划回报的可读性明显更高。所以我不明白你为什么要这样做。
"The goto statement transfers the program control directly to a labeled statement."
您有
exitMethod
作为您的标签,但在第一个示例中您没有任何声明。这就是您收到错误的原因。
你需要一些事情让
goto
去做。不能为空。
例如:
private void example()
{
for (int i = 0; i < 100; i++)
{
for (int ii = 0; ii < 100; ii++)
{
for (int iii = 0; iii < 100; iii++)
{
goto exitMethod;
}
}
}
exitMethod:
int i = DoSomething();
}
您缺少一个分号 试试这个
退出方法:;
有两件事,不建议首先转到。由于标签的工作原理,它不允许您使用这样的标签。标签只是源代码标识符,允许您指向特定指令。在您尝试的情况下,它后面没有指令,因此它无法解析到指令的位置。这导致了您的错误。
再次强调,您不应该以这种方式使用 goto。如果您只是需要退出该函数,可以使用
return;
语句。如果您使用的编码标准仅规定单个返回点,请尝试如下操作:
private void example()
{
bool escaping = false;
for (int i = 0; i < 100 && !escaping; i++)
{
for (int ii = 0; ii < 100 && !escaping; ii++)
{
for (int iii = 0; iii < 100 && !escaping; iii++)
{
escaping = true;
break; // this is only needed if there is code farther down this
// inner loop that would otherwise be executed.
}
}
}
return;
}