14

ネストされたループを終了する方法を調査した後、使用してみることにしました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;;を使用してこの問題を簡単に解決できることを知っています。それでも、このエラーの原因を突き止めたいと思います。

4

6 に答える 6

19

ラベルは単独では存在しません。ステートメントにラベルを付けます。C# 5 仕様のセクション 8.4 から:

ラベル付きステートメントを使用すると、ステートメントの前にラベルを付けることができます。ラベル付きステートメントはブロック内で使用できますが、埋め込みステートメントとして使用することはできません。

この場合、メソッドの最後にラベルを適用しています - のラベルであるというステートメントはありませ。したがって、コンパイラがコードを拒否するのは絶対に正しいことです。

本当にやりたい場合は、冗長な return ステートメントにラベルを追加できます。

exitMethod:
    return;
}

...またはIrfanが示唆するように、空のステートメントです。ただし、声明が必要です。

しかし、私はそれをお勧めしません。goto exitMethod;ステートメントを単にに変更するだけreturnです。

于 2013-08-30T14:29:44.983 に答える
9

空白のステートメントを配置できます。

試す:

exitMethod: ;            

とにかく、現在のメソッドから本当に戻りたい場合は、return ステートメントを使用します。メソッドの戻り値の型が void 以外の場合、

return (type);

それ以外は

return;
于 2013-08-30T14:30:55.180 に答える
1

この場合

goto exitMethod;

ただのプレーンと同等です

return;

そして、その計画のリターンははるかに読みやすくなっています。だから、なぜそれをしたいのかわかりません。

于 2013-08-30T14:28:58.987 に答える
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();
}
于 2013-08-30T14:28:59.437 に答える
0
"The goto statement transfers the program control directly to a labeled statement." 

あなたはexitMethodラベルとして持っていますが、最初の例ではステートメントがありません。これが、エラーが発生する理由です。

参照に移動

于 2013-08-30T14:29:48.553 に答える