1

使用以下代码:

case "GETSITES":
case "SITESETUP":
    MessageBox.Show("Help! I am suffering from the Air-Conditioned Nightmare!!!");
    // ...

MessageBox.Show执行开关值是"GETSITES"还是"SITESETUP"

或者当开关值为"SITESETUP"?

由于"GETSITES"没有休息,我想是的,但不确定。


更新

我想我应该把我的问题表述为:

这两个代码片段在语义上是等价的吗?

  • 片段 1

    case 0:
    case 1:
        // bla bla bla;
        break;
    
  • 片段2(伪代码)

    case 0, 1:
        // bla bla bla;
        break;
    
4

3 回答 3

7

您所描述的是同一案例有两个标签。C# 确实允许这样做。但是,您不能以 C 允许的相同方式进入下一个 case 语句,也就是说,您的标签不能有一些代码,然后进入下一个 case 语句。这是禁止的,会导致编译错误。

于 2013-03-01T18:23:14.007 回答
6

C# 中的空 case 语句是否与下一个非空语句相结合?

我原来说:

这个问题假设了一个谎言。在合法的 C# 程序中不存在空的 switch 部分。

这并不完全正确。C#规范要求 switch 部分至少包含一个语句,但实现实际上没有。

我将我的陈述修改如下:

问题假设有一个空的 switch 部分(注意 switch 部分不是statements),但在非常不寻常的情况下只能有一个空的 switch 部分。首先,让我们清楚地描述 switch 语句的结构。

当你有:

switch(x) 
{ 
   case 1: 
   case 2: 
       Console.WriteLine("Hello");
       break;
}

只有一个开关部分。案例1之后没有“空白部分”;一个部分由所有case 子句组成,后跟零个或多个语句。(规范需要一个或多个语句,但实现实际上允许零个语句。)语句列表必须有一个不可到达的端点。

唯一的方法是让一个空语句列表在 switch 部分内无法到达其端点是使 switch 部分本身不可达。有两种可能发生的方式。整个交换机可能无法访问,或者交换机可能会持续打开。简而言之,制作空 switch 部分的唯一方法是:

switch(1) { case 2: }

或者

if (false) switch(x) { case 2: }

根据规范,两者都不合法,但 C# 编译器允许两者。幸运的是,这是一个非常无害的错误。

在这两种情况下,该部分的终点都是不可到达的,因此空部分是可到达的。但是 case之间永远不会有空白部分。

于 2013-03-01T19:34:32.580 回答
2

根据测试,您可以执行以下操作:

switch(i)
{
    case 0:
    case 1:
    case 2:
        doSomething();
        break;
    default:
        doNothing();
        break;
}

但你不能:

switch(i)
{
   case 0:
      doSomething();
   case 1:
      doSomethingElse();
      break;
   default:
      doNothing();
      break;
}

所以,答案是,是的,您可以将多个案例堆叠在一起,但您不能让控制从一个案例运行到另一个案例。

于 2013-03-01T18:26:06.537 回答