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

问题描述 投票:0回答:7

在研究了退出嵌套循环的方法后,我决定尝试使用

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)会抱怨(并且它不会编译),

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# visual-studio-2012 for-loop nested-loops goto
7个回答
20
投票

标签本身并不存在:它标记一个语句。来自 C# 5 规范第 8.4 节:

带标签的语句允许语句以标签为前缀。块中允许带标签的语句,但不允许作为嵌入语句。

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

如果您确实愿意,您可以向原本多余的返回语句添加标签:

exitMethod:
    return;
}

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

但我不会推荐它。只需将任何

goto exitMethod;
语句更改为简单的
return


11
投票

您可以放置空白声明。

尝试:

exitMethod: ;            

但是无论如何,如果你真的想从当前方法返回,请使用 return 语句。 如果方法具有除 void 之外的其他返回类型,

return (type);

否则

return;

1
投票

在这种情况下

goto exitMethod;

相当于普通

return;

而且该计划回报的可读性明显更高。所以我不明白你为什么要这样做。


0
投票
"The goto statement transfers the program control directly to a labeled statement." 

您有

exitMethod
作为您的标签,但在第一个示例中您没有任何声明。这就是您收到错误的原因。

转到参考资料


0
投票

你需要一些事情让

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();
}

0
投票

您缺少一个分号 试试这个

退出方法:;


-1
投票

有两件事,不建议首先转到。由于标签的工作原理,它不允许您使用这样的标签。标签只是源代码标识符,允许您指向特定指令。在您尝试的情况下,它后面没有指令,因此它无法解析到指令的位置。这导致了您的错误。

再次强调,您不应该以这种方式使用 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.