2

次のようなswitchステートメントがあります。

switch (condition)
{
    case 0:
    case 1:
        // Do Something
        break;
    case 2:
        // Do Something
    case 3:
        // Do Something
        break;
}

コンパイルエラーが発生し、次のように通知されますControl cannot fall through from one case label ('case 2:') to another

ええと...はい、できます。あなたはそれをからまでやっているからcase 0:ですcase 1:

実際、自分case 2:とそれに関連するタスクを削除すると、コードがコンパイルされ、からにフォールスルーcase 0:case1:ます。

では、ここで何が起こっているのでしょうか。また、caseステートメントを実行して、いくつかの中間コードを実行するにはどうすればよいでしょうか。

4

7 に答える 7

10

スタッキングラベルとフォールスルーには違いがあります。

C#は前者をサポートしています:

case 0:
case 1:
    break;

しかし、フォールスルーではありません:

case 2:
    // Do Something
case 3:
    // Do Something
    break;

フォールスルーが必要な場合は、明示的にする必要があります。

case 2:
    // Do Something
    goto case 3;
case 3:
    // Do Something
    break;

理由は明らかであり、暗黙のフォールスルーは、特に1行または2行を超える場合に、コードが不鮮明になる可能性があり、制御がどのように流れるかが明確ではありません。明示的なフォールスルーを強制することで、フローを簡単にたどることができます。

参照:msdn

于 2012-09-12T14:19:58.797 に答える
3

MSDNの引用:

「C#は、あるケースラベルから別のケースラベルへの暗黙のフォールスルーをサポートしていません。唯一の例外は、ケースステートメントにコードがない場合です。」

基本的に、ケース内にステートメントを入れたり、区切りを含めたりすることは違法です。

case 1:
case 2:
//do stuff
break;

合法です

しかし:

case 1:
//do stuff without a break
case 2:
//do stuff
break; 

ではありません。

http://msdn.microsoft.com/en-us/library/06tc147t(v=vs.80).aspx

于 2012-09-12T14:19:09.920 に答える
1

それらは同じコードブロックを共有しているので、からcase 0に落ちることはありません。これは、前にcase 1書くのと同じです。case 1case 0

于 2012-09-12T14:19:21.730 に答える
1

C#では、最初のラベルに特定のコードがない場合を除いて、ラベルを暗黙的に別のラベルにフォールスルーすることはできません。あなたが持つことができます

case 1:
case 2:
    // Do Something
break;

だがしかし

case 1:
    // Do Something
case 2:
    // Do Something
break;

より詳細な説明については、 msdnを参照してください。

明示的に失敗したい場合は、goto命令を使用できます。これは、gotoの使用が悪い習慣ではないまれなケースの1つでもあります。

case 1:
    // Do Something
    goto case 2;
case 2:
    // Do Something
break;
于 2012-09-12T14:26:03.853 に答える
0

C#でコードを「フォールスルー」できるのは、caseステートメントの間にコードがない場合のみです。コード例は、ケース2とケース3の間にコードがあることを示しています。

于 2012-09-12T14:19:40.450 に答える
0

これは許可されていません

switch (condition)
{
    case 0:
        // Do Something
    case 1:
        // Do Something
        break;
}

これは許可されています

    switch (condition)
    {
        case 0:
        case 1:
            // Do Something
            break;
    }
于 2012-09-12T14:20:20.467 に答える
0

問題は、ケース2で何かをしてから失敗しようとしていることですが、それはサポートされていません。追加のアクティビティなしで0から1になります。

于 2012-09-12T14:26:41.590 に答える