C#中的开关是空的情况还是下一个非空的?

使用以下代码:

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

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

或者当开关值为"SITESETUP"

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


UPDATE

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

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

  • 片段1

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

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

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

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

我原来说:

这个问题假设是虚假的。 在合法的C#程序中没有空切换部分。

那不是真的。 C# 规范要求切换部分包含至少一个语句,但实现实际上不包含。

我修改我的发言如下:

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

当你有:

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

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

在交换机部分内无法访问端点的空语句列表的唯一方法是交换机部分本身无法访问。 有两种方法可以实现。 整个交换机都可以无法访问,或者交换机可以打开常量。 简而言之,制作空开关部分的唯一方法是:

 switch(1) { case 2: } 

要么

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

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

在这两种情况下,都无法访问该部分的结束点,因此可以访问空部分。 但案件之间并不存在空白部分。

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

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

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