在C#中,如何对开关情况使用多个常量?

在C#中,如何对开关情况使用多个常量?,c#,C#,如何对开关盒C使用多个常数?从概念上讲,我在寻找这样的东西: switch(n) { case 1,2,3: //???? case 4: default: } switch(n) { case 1: case 2: case 3: break; case 4: break; default: break; } 你不用,你用的是“跌破” switch( n ) { case x:

如何对开关盒C使用多个常数?从概念上讲,我在寻找这样的东西:

switch(n)
{
   case 1,2,3:     //????
   case 4:
   default:
}
switch(n)
{
   case 1: case 2: case 3:     
       break;
   case 4:
       break;
   default:
       break;
}

你不用,你用的是“跌破”

switch( n )
{
    case x:
    case y:
    case z:
        DoSomething( );
        break;
    case blah:
        break;
}
试试这个:

switch(n)
{
  case 1:
  case 2:
  case 3:
    //Do Stuff
    break;
  case 4:
    //Do more stuff
    break;
  default:
    //Do standard stuff
    break;
}

请记住,只有在
案例1:
案例2:
块中没有代码时,这才有效。我

许多答案都指出,“如果案例为空,则失败是合法的”

这是不对的。这是错误的思考方式。这是一种推理,好像C是C,但事实并非如此。在C语言中,每个案例标签都有一个关联的语句列表,可能是空的,并且控件从语句列表的末尾“掉下来”。C#中的情况并非如此

在C#中,开关由多个部分组成,每个部分都有一个或多个大小写标签,每个部分都有一个或多个语句。当你说

switch(x)
{
    case 1:
    case 2:
      M();
      break;
}
这不是有两个开关段的情况,一个用于案例1,一个用于案例2,案例1的开关段为空,并通过第二个块。这是C的情况,但C不是C

在C#中,本例中有一个开关部分。它有两个标签和一个语句列表。案例标签之间没有空语句列表;不能有,因为语句列表位于节中的最后一个标签之后。让我重复一次:那里没有空的语句列表。根本没有语句列表,甚至没有空的语句列表

这一特征使我们能够清楚地说明C#中的漏洞百出规则,即“漏洞百出始终是非法的”。同样,控制从案例1的空语句列表“掉到”案例2中并不是这种情况。控制永远不会失败。控件不会在这里失败,因为控件从不在案例1之后进入空语句列表。控件无法输入该空语句列表,因为首先那里没有空语句列表。语句列表在案例2之后才开始

C#在每个交换机部分,包括最后一个交换机部分,强制执行“无故障”规则。这使得开关部分可以任意重新排序,可能是通过机械工具,而不会在程序中引入语义变化

C#通过要求每个开关段的端点都不可到达来强制执行“无故障”规则。开关段不必以中断结束。它可以以中断、返回、转到、继续、抛出或可检测的无限循环结束:

switch(x)
{
    case 1:
        while(true) M();
    case 2:
        return 123;
    case 3:
        throw new Exception();
    case 4:
        M();
        goto case 3;
}

上述各项都是合法的;没有中断。

最接近c#中的故障切换情况:

有关更多信息,请参见此处:


您可以这样做:

switch(n)
{
   case 1,2,3:     //????
   case 4:
   default:
}
switch(n)
{
   case 1: case 2: case 3:     
       break;
   case 4:
       break;
   default:
       break;
}

如果箱体是空的,则允许跌落。是的,它是空的。只要在最后一种情况下没有代码,你就可能失败。@Mehrdad:把C#当作C是C来思考是错误的。正确的想法是:(1)一个开关段可能有一个或多个开关标签,(2)每个开关段的端点必须是不可到达的。当您说“case1:case2:…”时,情况并不是在case1和case2之间有一个空的开关部分。那里根本没有任何开关区,不管是否为空。直到案例完成,切换部分才开始。@Ed:这是不合法的。您不能有任何空开关盒体,即使是最后一个。每个开关部分的终点都必须是无法到达的。@Mehrdad一定很喜欢删除的评论,这些评论会让你看起来有点疯狂。。)可能的重复正如我上面提到的,这是一个错误的想法。案例1没有空块。根本没有块,这与空块不同!第一个switch部分块直到案例3之后才开始。我最初的印象是它很迂腐,因为说“C#不支持fall-through,但允许多个case语句”和“C#supports fall-through只支持空case语句”乍一看是等效的。然而,“C#supports fall through only with empty case statement”意味着空的case语句是合法的,这是不正确的(如果您在最后一个case语句中使用空的case语句,可以证明这一点)。我想,C#在执行此操作时出错(“控制不能从一个案例标签“case x:”转到另一个案例标签“”)这一事实暗示了这一点。这很迂腐,但不仅仅是迂腐。您已经向我解释了为什么关于此的建议总是相互矛盾的。谢谢@EricLippert+1因为在这种情况下,它更像是一个经典的故障诊断(而不是没有块的情况)。