c# - 为什么不能在方法末尾添加 goto 标签?

标签 c# visual-studio-2012 for-loop nested-loops goto

在研究了退出嵌套循环的方法后,我决定尝试使用 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(旗舰版)会报错(并且无法编译),

Screenshot

但是如果我把我的代码改成这样,

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 节:

A labeled-statement permits a statement to be prefixed by a label. Labeled statements are permitted in blocks, but are not permitted as embedded statements.

在这种情况下,您在方法的末尾应用标签 - 没有声明它是 for 的标签。所以编译器拒绝你的代码是绝对正确的。

如果你真的想要,你可以添加一个标签到否则冗余的返回语句:

exitMethod:
    return;
}

... 或者只是空洞的陈述,正如 Irfan 所建议的那样。不过必须有一个声明。

但我不推荐它。只需将任何 goto exitMethod; 语句更改为简单的 return

关于c# - 为什么不能在方法末尾添加 goto 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18535283/

相关文章:

c# - 如何从 .DOCX 文件中获取带有图像的标题文本

c# - 将字符串解析为通用枚举类型

c++ getchar 在 vs 2010 中有效,在 2012 中无效

java - (Java) 使用嵌套循环

matlab - 是否可以避免在元胞数组上迭代时出现 "s{1} annoyance"?

javascript - 使用 cookie 时 for 循环中的 If/Elseif 语句问题 (javascript)

c# - StyleCop SA1124 DoNotUseRegions 是否合理?

c# - 是否有任何使用 rsync 的 .NET API?

c# - Visual Studio 2012 在构建时崩溃

c# - 如何在 Visual Studio Express 2012 中添加 resx 文件?