今日、私は小さなコードを書いていましたが、デバッグ時にVSが私を叩き、ローカル変数の名前に大きな間違いを犯したと言いました。「「i」という名前のローカル変数はすでにこのスコープで定義されています」。
MyEnum enumerator = MyEnum.B;
switch (enumerator)
{
case MyEnum.A:
Int32 i = 0;
// DoStuffsA();
break;
case MyEnum.B:
Double i = 0D;
// DoStuffsB();
break;
}
それで、「OK VS、すぐに修正させてください。もっと気に入ったので、最初にケースのスコープを設定したいと思います!」と言いました。だから私は化粧品を変更しました...しかし突然VSはそのエラーについて泣き言を言うのをやめました:
MyEnum enumerator = MyEnum.B;
switch (enumerator)
{
case MyEnum.A:
{
Int32 i = 0;
// DoStuffsA();
break;
}
case MyEnum.B:
{
Double i = 0D;
// DoStuffsB();
break;
}
}
わかりました...私は「スコープ」の意味を知っており、そのように2つの異なるスコープを作成したことを知っています。問題は、switchステートメントがILコードにどのように変換されるかわからないことです。中括弧が使用されているかどうかに関係なく、すべてのcaseステートメントがswitchスコープに配置されると常に考えていました。だから...次の奇妙なことをコンパイルすることができますよね?
MyEnum enumerator = MyEnum.B;
switch (enumerator)
{
case MyEnum.A:
String s = "Hello!";
Console.WriteLine(s);
break;
case MyEnum.B:
s = "Goodbye!";
Console.WriteLine(s);
break;
}
しかし、次のものではありません:
MyEnum enumerator = MyEnum.B;
switch (enumerator)
{
case MyEnum.A:
{
String s = "hello";
Console.WriteLine(s);
break;
}
case MyEnum.B:
{
s = "goodbye";
Console.WriteLine(s);
break;
}
}
この状況でのコンパイラの動作をよりよく説明できる人がいますか?どうもありがとう!