C#switch variable initialization:为什么这段代码不会导致编译错误或运行时错误?

时间:2009-05-14 15:51:03

标签: c# switch-statement

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


有没有我不了解C#中的switch语句?为什么在使用案例2时这不是错误?
编辑:此代码有效并且不会引发错误。

6 个答案:

答案 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。