2

我有一个 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:into case1:.

那么这里发生了什么,我怎样才能让我的案例语句通过并执行一些中间代码?

4

7 回答 7

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

于 2012-09-12T14:19:58.797 回答
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

于 2012-09-12T14:19:09.920 回答
1

因为它们共享相同的代码块case 0,所以您不会跌倒。case 1这和之前写的case 1一样case 0

于 2012-09-12T14:19:21.730 回答
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;
于 2012-09-12T14:26:03.853 回答
0

只有当 case 语句之间没有代码时,代码才能在 C# 中“失败”。代码示例推断在案例 2 和案例 3 之间存在代码。

于 2012-09-12T14:19:40.450 回答
0

这是不允许

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

这是允许的

    switch (condition)
    {
        case 0:
        case 1:
            // Do Something
            break;
    }
于 2012-09-12T14:20:20.467 回答
0

问题是您在案例 2 中做某事,然后试图失败,这是不受支持的。你从 0 到 1 没有任何额外的活动。

于 2012-09-12T14:26:41.590 回答