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
中看到它?如果从来没有两个案例一起发生,为什么要在两者中看到这个对象?
答案 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有break
或return
:
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
标签没有什么特别之处;他们不会改变变量的范围。