我一直在想:
我写的时候:
switch (temp)
{
case "1":
int tmpInt = 1;
break;
}
case "1":
区域有一个执行的代码区域(直到中断)
现在,
从上方的瀑布无法进入case of 2
,例如:
switch (temp)
{
case "1":
int tmpInt = 1;
case "2":
break;
}
//错误:缺少中断返回。
所以我假设,他们有不同的执行区域(案例......休息)。
那么为什么会出现这种错误?
//冲突变量tmpInt定义如下。
P.S。这只是一个愚蠢的问题,仍然很有趣。
答案 0 :(得分:30)
在C#中,范围仅由大括号决定。如果没有,则没有单独的范围。使用switch
/ case
时,显然没有。您所谓的“执行区域”与您可以引用变量的位置完全无关。一个人为的例子:
int x = 1;
goto foo;
// This part gets never executed but you can legally refer to x here.
foo:
如果您愿意,可以执行以下操作:
switch (temp)
{
case "1":
{
int tmpint = 1;
break;
}
case "2":
{
int tmpint = 1;
break;
}
}
事实上,对于一些switch
语句,我这样做,因为它通过不污染其他case
使生活变得更容易。我有时会想念Pascal; - )
关于您的尝试尝试,您必须使用goto case "2"
在C#中明确说明。
答案 1 :(得分:1)
试试这个
int tmpInt = 0;
switch (temp)
{
case "1":
case "2":
tmpInt = 1;
break;
}
因此,当案例为1或2时,它会将tmpint设置为1
答案 2 :(得分:1)
C#语言规范的第8.5.1节说:
在local-variable-declaration中声明的局部变量的范围是声明发生的块。在局部变量的local-variable-declarator之前的文本位置引用局部变量是错误的。在局部变量的范围内,声明另一个具有相同名称的局部变量或常量是编译时错误。
这种情况下的块是switch语句,因为块由大括号确定。
答案 3 :(得分:1)
这是因为您在同一范围内声明了一个具有相同名称的局部变量,就像intellisense告诉您何时将鼠标悬停在错误行上一样。
这就是为什么你真的应该在每种情况下使用花括号:
switch(var)
{
case 1:
{
int temp=0;
} break;
case 2:
{
int temp=0;
} break;
}
这解决了“问题”(这实际上不是问题,这是范围的工作方式)。
答案 4 :(得分:0)
您正在创建两次相同的变量,即int tmpInt = 1;