...
case 1:
string x = "SomeString";
...
break;
case 2:
x = "SomeOtherString";
...
break;
...
有没有我不了解C#中的switch语句?为什么在使用案例2时这不是错误?
编辑:此代码有效并且不会引发错误。
答案 0 :(得分:16)
您必须谨慎对待switch
声明。事实上,根本没有创建变量范围。不要因为案例中的代码缩进而使其驻留在子范围内这一事实。
当编译开关块时,case
标签只是转换为标签,并且在switch语句的开头执行适当的goto
指令,具体取决于切换表达式。实际上,您可以手动使用goto
语句创建“直通”情境(C#直接支持),如the MSDN page所示。
goto case 1;
如果您特别想在switch
块中为每个案例创建范围,则可以执行以下操作。
...
case 1:
{
string x = "SomeString";
...
break;
}
case 2:
{
string x = "SomeOtherString";
...
break;
}
...
此要求重新声明变量x
(否则您将收到编译器错误)。在某些情况下,确定每个(或至少一些)范围的方法非常有用,您肯定会在代码中不时看到它。
答案 1 :(得分:8)
MSDN上的文档说:
在switch语句的switch-block中声明的局部变量的范围(第8.7.2节)是switch-block。
此外,之前曾提出类似的问题: Variable declaration in c# switch statement
答案 2 :(得分:4)
没有编译器错误,因为switch语句不会为变量创建新范围。
如果在开关内部声明变量,则变量与开关周围的代码块在同一范围内。要更改此行为,您需要添加{}:
...
case 1:
// Start a new variable scope
{
string x = "SomeString";
...
}
break;
case 2:
{
x = "SomeOtherString";
...
}
break;
...
这会导致编译器抱怨。但是,切换本身并不会在内部执行此操作,因此代码中没有错误。
答案 3 :(得分:1)
看起来变量的范围是在开关内,而不是这种情况,可能是因为案例可以堆叠。请注意,如果您尝试在开关外部引用x,则它将失败。
答案 4 :(得分:0)
如果在大小写内创建任何局部变量,则不能将它们用在旁边的情况下。
...
int opt ;
switch(opt)
{
case 1:
{
string x = "SomeString";
...
}
break;
case 2:
{
string x = "SomeOtherString";
...
}
break;
default:
{
//your code
}
break;
}
...
答案 5 :(得分:-2)
将字符串声明移到
之前switch(value)
语句。然后为每个案例分配x。