幽灵般的范围问题 - C# - Switch - 案例

时间:2013-12-05 14:13:56

标签: c# switch-statement

因此,如果我有一个包含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;
}

我在这里缺少一个明显的语法折叠空间吗?

3 个答案:

答案 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;
}