这个问题让我想起我对开关头脑的老悬而未决的问题的:
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 ...");
}
为什么EMP在“案例2”的认可? 在C ++(如果我没看错),我们可以使用多个案件一起,但在C#这是不可能的,我们应该关闭case 1
所以下面的代码在C ++中,似乎对与错在C#与突破:
case 1:
case 2:
SomeMethodUsedByBothStates();
当我们不能有这样的行为,所以我们为什么能在申报EMP case 1
,看看它的case 2
? 如果从来没有2案件发生一起何必对象是否可以同时看到?
案件不创建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;
}
...
}
您显示第二个代码是在C#中完全正常,假设的情况下2有一个break
或return
:
case 1:
// no code here...
case 2:
SomeMethodUsedByBothStates();
break;
空箱允许告吹。
什么是不允许的是有代码的情况下,分支漏网。 因此,下面将是无效的:
case 1:
SomeMethodUsedOnlyByCase1();
// no break here...
case 2:
SomeMethodUsedByBothStates();
break;
有关范围的问题是不同的。 基本上,范围是switch语句本身,而不是一个情况分支。
为了使您的例子编译,干脆放弃的情况下,分公司自己的范围,加入大括号:
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 ...");
}
当您在一个机箱内声明变量,使用大括号来spesification。
int personType = 1;
switch (personType)
{
case 1:
{
///
break;
}
case 2:
{
///
break;
}
case 3:
{
///
break;
}
...
}
该范围不奇怪的。 局部变量的范围是从那里它被定义在其中它被定义所述块的端部的点。 这样的各种emp
变量各自的范围,直到块的与所述开始端{
后switch
语句,并在相应的结束}
。 没有什么特别的case
标签; 他们不改变的变量的作用域。