12

可能重复:
c# switch 语句中的变量声明

我一直想知道:

当我写:

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

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

现在 ,

从上面的瀑布不能进入case of 2例如:

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

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

所以我假设,他们有不同的处决区域(case....break)。

那么为什么会出现这个错误呢?

在此处输入图像描述

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

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

4

5 回答 5

34

在 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语句,我会这样做,因为它不会污染其他cases,从而使生活变得更加轻松。我有时会想念帕斯卡;-)

关于您尝试的失败,您必须在 C# 中使用goto case "2".

于 2012-07-10T08:56:56.980 回答
1

试试这个

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

所以当 case 为 1 或 2 时,它会将 tmpint 设置为 1

于 2012-07-10T08:57:10.897 回答
1

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

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

本例中的块是 switch 语句,因为块由大括号确定。

于 2012-07-10T08:57:19.797 回答
1

发生这种情况是因为您在同一范围内声明了一个具有相同名称的局部变量,就像当您将鼠标悬停在错误行上时智能感知会告诉您一样。

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

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

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

于 2012-07-10T08:59:31.893 回答
0

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

于 2012-07-10T08:52:13.630 回答