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

B. *_*non -1 c# language-design switch-statement

使用以下代码:

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

MessageBox.Show被执行或者开关值为"GETSITES"还是"SITESETUP"

或者当开关值是"SITESETUP"

既然"GETSITES"没有休息,我想是的,但我不确定.


UPDATE

我想我应该把我的问题写成:

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

tva*_*son 7

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


Eri*_*ert 6

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

我原来说:

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

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

我修改我的发言如下:

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

当你有:

switch(x) 
{ 
   case 1: 
   case 2: 
       Console.WriteLine("Hello");
       break;
}
Run Code Online (Sandbox Code Playgroud)

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

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

switch(1) { case 2: }
Run Code Online (Sandbox Code Playgroud)

要么

if (false) switch(x) { case 2: }
Run Code Online (Sandbox Code Playgroud)

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

在这两种情况下,都无法访问该部分的结束点,因此可以访问空部分.但从来没有案例之间存在空白部分.

  • 天哪,你再次正确.这*是一个错误.规范要求开关部分非空.我不敢相信我以前从未注意过. (3认同)
  • 谢谢!但我想我误解了规范,因为它定义了_switch-section:switch-labels statement-list_和_statement-list:statement | statement-list statement_,所以我认为`switch(1){case 2:}`甚至不应该解析,因为缺少_statement-list_. (2认同)