15

switch、代わりに単語や1文字を書いてもdefault 、エラーは発生しません。例えば

switch(10)
{
    case 1:
    break;

    hello:
    break;
}

エラーをスローせずに実行されます。

誰かがこれがどのように機能するか説明できますか?

4

3 に答える 3

16

hello:はラベルであり、したがって。の宛先になる可能性があるため、コンパイル中gotoです。これをコンパイルすると、参照されていないラベルに関する警告が表示されました(gotoがなかったため)

LINQPadをスローできる例を次に示します。「1」と「hello」の両方が出力されることに気付くでしょう。

switch(1)
{
    case 1:
        "1".Dump();
        goto hello;
    break;

    hello:
        "hello".Dump();
        break;
}
于 2012-11-15T05:50:23.603 に答える
13

switchそれは声明とは無関係です。これは、(悪い習慣のためにめったに使用されない)gotoステートメントのラベル識別子です。

goto something2;
something1:
    Console.WriteLine("world");
    goto done;
something2:
    Console.WriteLine("hello");
goto something1;
done:
于 2012-11-15T05:50:28.187 に答える
5

あなたの例では、次のコードスニペットを見ることができます。

switch (10)
{
    case 1:
        break;

    hello:
        Console.Write("In hello label");
        break;
    case 2:
        goto hello;
        break;
}

上記では、switchステートメントでgotoステートメントのラベルを定義しています。switchステートメントがに該当する場合case 2は、ラベルに移動しhelloます。元のコードスニペットにはがないgoto hello;ため、参照されていないラベルの警告が表示されます。

ラベルhello は、switchステートメントで何もする必要はありません(内部で定義されている場合を除く)。

于 2012-11-15T05:54:37.157 に答える