我有一个如下所示的开关语句:
switch (condition)
{
case 0:
case 1:
// Do Something
break;
case 2:
// Do Something
case 3:
// Do Something
break;
}
我收到编译错误,告诉我Control cannot fall through from one case label ('case 2:') to another
嗯......是的,你可以。因为您是从case 0:
到case 1:
进行的。
事实上,如果我删除了我的case 2:
及其相关任务,则代码会编译并从case 0:
进入case1:
。
那么这里发生了什么,如何让我的案例陈述通过并执行一些中间代码?
答案 0 :(得分:10)
堆叠标签和掉落之间存在差异。
C#支持前者:
case 0:
case 1:
break;
但不是落空:
case 2:
// Do Something
case 3:
// Do Something
break;
如果你想要堕落,你需要明确:
case 2:
// Do Something
goto case 3;
case 3:
// Do Something
break;
推理显而易见,隐式转换会导致代码不干净,特别是如果你有多于一行或两行,并且不清楚控制是如何流动的。通过强制显式降低,您可以轻松地遵循流程。
参考:msdn
答案 1 :(得分:3)
引用MSDN:
“C#不支持从一个案例标签到另一个案例标签的隐式下降。一个例外是案例陈述没有代码。”
基本上将陈述置于案件内并且不包括休息是不合法的。
case 1:
case 2:
//do stuff
break;
是合法的
但:
case 1:
//do stuff without a break
case 2:
//do stuff
break;
不是。
http://msdn.microsoft.com/en-us/library/06tc147t(v=vs.80).aspx
答案 2 :(得分:1)
由于他们共享相同的代码块,因此您不会从case 0
下降到case 1
。这与在case 1
之前撰写case 0
相同。
答案 3 :(得分:1)
在C#中,除非第一个标签没有特定代码,否则不能隐式地通过标签。 你可以
case 1:
case 2:
// Do Something
break;
但不是
case 1:
// Do Something
case 2:
// Do Something
break;
请参阅msdn以获得更深入的解释。
如果您希望明确地通过,可以使用goto指令。这也是罕见的情况之一,使用goto并不是一种不好的做法。
case 1:
// Do Something
goto case 2;
case 2:
// Do Something
break;
答案 4 :(得分:0)
只有在case语句之间没有代码时,代码才能在C#中“掉头”。代码示例推断出案例2和案例3之间存在代码。
答案 5 :(得分:0)
这是不允许
switch (condition)
{
case 0:
// Do Something
case 1:
// Do Something
break;
}
这是允许的
switch (condition)
{
case 0:
case 1:
// Do Something
break;
}
答案 6 :(得分:0)
问题是你在案例2中做了一些事情,然后试图通过,而且不支持。你没有任何额外的活动,从0到1。