switch语句中的奇数变量范围

时间:2012-12-05 13:25:04

标签: c# c++ scope switch-statement

This question让我想起了一个关于转换的一个未解决的问题:

    int personType = 1;
    switch (personType)
    {
        case 1:
            Employee emp = new Employee();
            emp.ExperienceInfo();
            break;
        case 2:
            Employee emp = new Employee(); 
            //Error: A local variable named 'emp' is already defined in this scope
            emp.ManagementInfo();
            break;
        case 3:
            Student st = new Student();
            st.EducationInfo();
            break;
        default:
            MessageBox.Show("Not valid ...");
    }

为什么在'案例2'中认可了emp?在C ++中(如果我没有错)我们可以一起使用多个案例,但在C#中这是不可能的,我们应该使用break关闭case 1,所以下面的代码在C ++中似乎是正确的而在C#中是错的:

case 1:
case 2:
   SomeMethodUsedByBothStates();

当我们不能有这样的行为时,为什么我们能够在case 1中声明emp并在case 2中看到它?如果从来没有两个案例一起发生,为什么要在两者中看到这个对象?

4 个答案:

答案 0 :(得分:34)

案例不会在c ++或c#中创建范围。在案例中声明的所有变量都与switch语句的范围相同。如果您希望这些变量在某些特定情况下是本地的,则需要使用大括号:

switch (personType)
{
    case 1: {
        Employee emp = new Employee();
        emp.ExperienceInfo();
        break;
    }
    case 2: {
        Employee emp = new Employee(); 
        // No longer an error; now 'emp' is local to this case.
        emp.ManagementInfo();
        break;
    }
    case 3: {
        Student st = new Student();
        st.EducationInfo();
        break;
    }
    ...
}

答案 1 :(得分:5)

您展示的第二个代码在C#中完全没问题,假设案例2有breakreturn

case 1:
    // no code here...
case 2:
    SomeMethodUsedByBothStates();
    break;

允许空案件通过。
什么是允许的是在案例分支中包含代码。因此,以下内容无效:

case 1:
    SomeMethodUsedOnlyByCase1();
    // no break here...
case 2:
    SomeMethodUsedByBothStates();
    break;

关于范围的问题是另一个问题。 基本上,范围是switch语句本身,而不是case-branch。

要使您的示例编译,只需通过添加花括号来给出自己的case-branches范围:

int personType = 1;
switch (personType)
{
    case 1:
    {
        Employee emp = new Employee();
        emp.ExperienceInfo();
        break;
    }
    case 2:
    {
        Employee emp = new Employee(); 
        emp.ManagementInfo();
        break;
    }
    case 3:
    {
        Student st = new Student();
        st.EducationInfo();
        break;
    }
    default:
        MessageBox.Show("Not valid ...");
}

答案 2 :(得分:2)

在案例中声明变量时,请使用大括号来指定。

int personType = 1;
switch (personType)
{
    case 1: 
   {
     ///
     break;
   }
    case 2: 
   {
     ///
     break;
    }
    case 3: 
   {
        ///
        break;
   }
    ...
}

答案 3 :(得分:0)

范围根本不奇怪。局部变量的范围是从定义它的位置到定义它的块的末尾。因此,各种emp变量都在范围内,直到在{语句之后以switch开头并以相应的}结束的块结束。 case标签没有什么特别之处;他们不会改变变量的范围。