通过switch语句(有时工作?)

时间:2012-09-12 14:17:19

标签: c# switch-statement fall-through

我有一个如下所示的开关语句:

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:

那么这里发生了什么,如何让我的案例陈述通过并执行一些中间代码?

7 个答案:

答案 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。