C#总是允许你在switch()语句之间的case:语句中省略大括号吗?
如javascript程序员经常做的那样省略它们有什么作用?
例:
switch(x)
{
case OneWay:
{ // <---- Omit this entire line
int y = 123;
FindYou(ref y);
break;
} // <---- Omit this entire line
case TheOther:
{ // <---- Omit this entire line
double y = 456.7; // legal!
GetchaGetcha(ref y);
break;
} // <---- Omit this entire line
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
c#switch语句中的变量声明
我一直在想:
我写的时候:
switch (temp)
{
case "1":
int tmpInt = 1;
break;
}
Run Code Online (Sandbox Code Playgroud)
该case "1":区域有一个代码区域被执行(直到休息)
现在,
从上面的瀑布无法进入case of 2例如:
switch (temp)
{
case "1":
int tmpInt = 1;
case "2":
break;
}
Run Code Online (Sandbox Code Playgroud)
//错误:缺少中断返回.
所以我假设,他们有不同的执行区域(案例......休息).
为什么会出现这种错误呢?

//冲突变量tmpInt定义如下.
ps这只是一个愚蠢的问题,仍然很有趣.
今天我写了一小段代码,在调试时,VS打了我一眼,告诉我我的局部变量名称犯了一个大错:"在这个范围内已经定义了一个名为'i'的局部变量".
MyEnum enumerator = MyEnum.B;
switch (enumerator)
{
case MyEnum.A:
Int32 i = 0;
// DoStuffsA();
break;
case MyEnum.B:
Double i = 0D;
// DoStuffsB();
break;
}
Run Code Online (Sandbox Code Playgroud)
所以我说"好吧VS,让我稍后解决它,我想首先考虑我的情况,因为我更喜欢它们!".所以我做了我的化妆品改变......但是突然VS停止抱怨这个错误:
MyEnum enumerator = MyEnum.B;
switch (enumerator)
{
case MyEnum.A:
{
Int32 i = 0;
// DoStuffsA();
break;
}
case MyEnum.B:
{
Double i = 0D;
// DoStuffsB();
break;
}
}
Run Code Online (Sandbox Code Playgroud)
好的...我知道"范围"的含义,我知道我生产了两个不同的范围.问题是我不知道如何将switch语句转换为IL代码,并且我一直认为所有case语句都放在switch范围内,无论是否使用花括号.所以...可以编译以下奇怪,对吧?
MyEnum enumerator = MyEnum.B;
switch (enumerator)
{
case MyEnum.A:
String s = "Hello!";
Console.WriteLine(s);
break;
case MyEnum.B: …Run Code Online (Sandbox Code Playgroud)