C#Switch / case共享相同的范围?

时间:2012-07-10 08:48:43

标签: c# .net .net-4.0 clr switch-statement

  

可能重复:
  Variable declaration in c# switch statement

我一直在想:

我写的时候:

 switch (temp)
        {
            case "1":
                int tmpInt = 1;
                break;

        }

case "1":区域有一个执行的代码区域(直到中断)

现在,

上方的瀑布无法进入case of 2,例如:

  switch (temp)
        {
            case "1":
                int tmpInt = 1;

            case "2":

                break;
        }

//错误:缺少中断返回。

所以我假设,他们有不同的执行区域(案例......休息)。

那么为什么会出现这种错误?

enter image description here

//冲突变量tmpInt定义如下。

P.S。这只是一个愚蠢的问题,仍然很有趣。

5 个答案:

答案 0 :(得分:30)

在C#中,范围仅由大括号决定。如果没有,则没有单独的范围。使用switch / case时,显然没有。您所谓的“执行区域”与您可以引用变量的位置完全无关。一个人为的例子:

int x = 1;
goto foo;
// This part gets never executed but you can legally refer to x here.
foo:

如果您愿意,可以执行以下操作:

switch (temp)
{
    case "1":
        {
            int tmpint = 1;
            break;
        }
    case "2":
        {
            int tmpint = 1;
            break;
        }
}

事实上,对于一些switch语句,我这样做,因为它通过不污染其他case使生活变得更容易。我有时会想念Pascal; - )

关于您的尝试尝试,您必须使用goto case "2"在C#中明确说明。

答案 1 :(得分:1)

试试这个

int tmpInt = 0;
switch (temp)
        {
            case "1":
            case "2":
                tmpInt = 1;
                break;
        }

因此,当案例为1或2时,它会将tmpint设置为1

答案 2 :(得分:1)

C#语言规范的第8.5.1节说:

  

在local-variable-declaration中声明的局部变量的范围是声明发生的块。在局部变量的local-variable-declarator之前的文本位置引用局部变量是错误的。在局部变量的范围内,声明另一个具有相同名称的局部变量或常量是编译时错误。

这种情况下的块是switch语句,因为块由大括号确定。

答案 3 :(得分:1)

这是因为您在同一范围内声明了一个具有相同名称的局部变量,就像intellisense告诉您何时将鼠标悬停在错误行上一样。

这就是为什么你真的应该在每种情况下使用花括号:

switch(var)
{
    case 1: 
    {
        int temp=0;
    } break;
    case 2:
    {
        int temp=0;
    } break;
}

这解决了“问题”(这实际上不是问题,这是范围的工作方式)。

答案 4 :(得分:0)

您正在创建两次相同的变量,即int tmpInt = 1;