因此,如果我有一个包含3个案例的开关,则每个案例都会在其中声明重复的局部变量。你会认为变量对于那种情况是局部的,所以你应该能够重复使用相同的名称。但是,这似乎并不是“案例”。
显然,其他案例块可以看到彼此的变量。
好的,没什么大不了的?除了当你尝试访问它可以明显看到的变量时,它说它看不到它?
int index = list.SelectedIndex;
switch(index){
case(0):
bool val = true; //First declaration s'allll good
if(val) //No issues here either obviously
MessageBox.Show("Huh?");
break;
case(1):
bool val = true; //Says it already exists??
if(val)
MessageBox.Show("Huh?");
break;
case(2):
bool val3 = true; //Change the variable name so you can use it however,
if(val) //When you try to access the val in case 0 it says it doesn't exist?????
MessageBox.Show("Huh?");
break;
}
我在这里缺少一个明显的语法折叠空间吗?
答案 0 :(得分:2)
IL中的变量被定义为switch
的范围,因此您无法在其他case
语句中重用它们,因为它会重新定义它们。
同样,你仍然需要为每个case
定义变量(即你已经看到即使一个case
拥有变量,其他人也可以实际利用其定义)。
对您而言,更好的方法是在val
之外定义switch
。
答案 1 :(得分:0)
由于案例只是标签,因此案例之间没有范围 - 他们可以在案例的最高范围内看到变量,从而导致val
上的冲突。
您可以将bool val
移到开关之外,也可以将大小写括在大括号中以自行调整范围,即
case(0):
{
bool val = true;
if (val)
MessageBox.Show("Huh?");
}
break;
答案 2 :(得分:-1)
switch语句中的变量的范围限定为整个switch语句。请参见底部的这个MSDN页面“切换块中声明的局部变量或常量的范围是切换块。”
为了解决这个问题,你可以在switch语句之上声明变量,或者(不太干净地)将它声明一次并在整个switch语句中重复使用,就像这样。
int index = list.SelectedIndex;
switch(index){
case(0):
bool val = true; //First declaration s'allll good
if(val) //No issues here either obviously
MessageBox.Show("Huh?");
break;
case(1):
val = true; //Declared in case 0
if(val)
MessageBox.Show("Huh?");
break;
case(2):
val = true; //Still declared from case 0
if(val)
MessageBox.Show("Huh?");
break;
}