2012-09-12 24 views
2

我有一个switch语句,如下面的一个:通过switch语句落(作品有时?)

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:

那么在这里发生了什么,以及如何让我的病例陈述落空并执行一些中间代码?

回答

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

+0

另请注意,忘记添加可能导致无意穿透的“break”是很常见的。 – Servy

+0

接受这个答案是最完整的,并且是第一个包含'goto case'的信息,这正是我所期待的。谢谢。 –

+0

感谢您提供正确的goto语法! – Jason

3

引述MSDN:“ C#不支持从一个case标签通过隐秋到另一个唯一的例外是,如果一个case语句无代码”

基本上将陈述放入案件并不包括休息是不合法的。

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

1

你是不是从case 0下降到case 1,因为它们共享相同的代码块。这与在case 0之前编写case 1相同。

0

只有在case语句之间没有代码的情况下,代码才能在C#中“通过”。该代码示例推断存在情况2和情况3之间的代码。

0

这是允许

switch (condition) 
{ 
    case 0: 
     // Do Something 
    case 1: 
     // Do Something 
     break; 
} 

这是允许的

switch (condition) 
    { 
     case 0: 
     case 1: 
      // Do Something 
      break; 
    } 
+0

那么编译器告诉他,当他尝试使用他发布的代码时... – Servy

+1

@Servy智能编译器;) –

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; 
0

问题是,你正在做情况2的东西,然后试图通过,并且不支持。没有任何附加活动,你将从0到1。