今天我正在编写一小段代码,在调试时,VS 打了我一巴掌,告诉我我的局部变量名称犯了一个大错误:“一个名为‘i’的局部变量已经在这个范围内定义了”。
MyEnum enumerator = MyEnum.B;
switch (enumerator)
{
case MyEnum.A:
Int32 i = 0;
// DoStuffsA();
break;
case MyEnum.B:
Double i = 0D;
// DoStuffsB();
break;
}
所以我说“好吧 VS,让我马上解决它,我想先确定我的案例,因为我更喜欢它们!”。所以我做了我的化妆品改变......但突然VS停止抱怨那个错误:
MyEnum enumerator = MyEnum.B;
switch (enumerator)
{
case MyEnum.A:
{
Int32 i = 0;
// DoStuffsA();
break;
}
case MyEnum.B:
{
Double i = 0D;
// DoStuffsB();
break;
}
}
好的...我知道“范围”的含义,并且我知道我制作了两个不同的范围。问题是我不知道 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;
}
}
在这种情况下,有人可以更好地解释编译器的行为吗?非常感谢!