9
...
case 1:
   string x = "SomeString";
   ...
   break;
case 2:
   x = "SomeOtherString";
   ...
   break;
...


C#のswitchステートメントについて理解していないことがありますか?ケース2を使用した場合、なぜこれがエラーにならないのでしょうか。
編集:このコードは機能し、エラーをスローしません。

4

6 に答える 6

18

switchここでのステ​​ートメントについてどう考えるか注意する必要があります。実際、可変スコープの作成はまったく行われていません。ケース内のコードがインデントされたからといって、子スコープ内にあるという事実を認めないでください。

switchブロックがコンパイルされると、caseラベルは単純にラベルに変換さgotoれ、switching式に応じてswitchステートメントの先頭で適切な命令が実行されます。実際、 MSDNページが示唆しているように、ステートメントを手動で使用gotoして「フォールスルー」状況(C#が直接サポートしている)を作成できます。

goto case 1;

ブロック内の各ケースのスコープを具体的に作成したい場合switchは、次のようにすることができます。

...
case 1:
{
   string x = "SomeString";
   ...
   break;
}
case 2:
{
   string x = "SomeOtherString";
   ...
   break;
}
...

これには、変数を再宣言する必要がありxます(そうしないと、コンパイラエラーが発生します)。それぞれ(または少なくともいくつか)をスコープする方法は、特定の状況で非常に役立つ場合があり、コードで時々それを確実に見ることができます。

于 2009-05-14T15:55:49.680 に答える
8

MSDNのドキュメントには次のように書かれています。

switchステートメント(セクション8.7.2)のswitch-blockで宣言されたローカル変数のスコープは、switch-blockです。

また、以前にも同様の質問があり ました。c#switchステートメントでの変数宣言

于 2009-05-14T15:55:07.997 に答える
4

switchステートメントは変数の新しいスコープを作成しないため、コンパイラエラーは発生しません。

スイッチ内で変数を宣言する場合、変数はスイッチを囲むコードブロックと同じスコープにあります。この動作を変更するには、{}を追加する必要があります。

...
case 1:
    // Start a new variable scope 
    {
        string x = "SomeString";
        ...
    }
    break;
case 2:
    {
        x = "SomeOtherString";
        ...
    }
    break;
...

これにより、コンパイラは文句を言います。ただし、switch自体は内部的にこれを行わないため、コードにエラーはありません。

于 2009-05-14T15:56:38.787 に答える
1

変数のスコープは、ケースではなくスイッチ内にあるように見えます。おそらく、ケースを積み重ねることができるためです。スイッチの外部でxを参照しようとすると、失敗することに注意してください。

于 2009-05-14T15:59:32.370 に答える
0

ケース内でローカル変数を作成している場合、ケース外でそれらを使用することはできません。

...
int opt ;
switch(opt)
{
case 1:
{
   string x = "SomeString";
   ...
}
   break;
case 2:
{
   string x = "SomeOtherString";
   ...
}
   break;
default:
{
//your code
}
break;
}
...
于 2009-05-14T15:56:17.430 に答える
-2

文字列宣言を前に移動します

switch(value)

声明。次に、それぞれの場合にxを割り当てます。

于 2009-05-14T15:52:59.500 に答える