什么是带有OR-ing的VB.NET select case语句逻辑?

Lly*_*yle 53 vb.net syntax switch-statement

我在我的case表达式中使用了Or语句.

即使我有一个在此范围内的值,它也找不到匹配项.为什么不?

示例代码:

Select Case 2
    Case 0
        ' Some logic

    Case 1
        ' Some other logic

    Case 2 Or 3
        Console.WriteLine("hit")

 End Select
Run Code Online (Sandbox Code Playgroud)

有了上面我会假设hit将打印,但事实并非如此.

Jar*_*Par 96

使用逗号运算符分隔case语句

Select Case 2
    Case 0,1,2,3
        Console.WriteLine("hit")
 End Select
Run Code Online (Sandbox Code Playgroud)

  • -1,因为它没有回答所述的问题.它提供了提问者尝试的替代解决方案.问题是:VB如何解释Select语句中的OR运算符?否则,必须编辑问题以匹配答案.但我不建议,因为@JohnT给出了正确答案. (3认同)
  • @Geoffrey,国际海事组织了解OP的意图比回答他所要求的更为重要.这是法律文字与法律精神之间的相同概念.两者都是正确的,但我认为法律的精神(即他的意图)更为正确. (3认同)

小智 24

正如Jared所说,您需要使用逗号运算符来分隔case语句.

Or你在做一个按位OR,导致它成为"3".有趣的是,"2和3"可能适用于您的具体案例.


Jas*_*yon 20

JaredPar没错,但您也可以使用To构造

Select Case 2
    Case 0,1
    Case 2 To 3
        Console.WriteLine("Hit")
End Select
Run Code Online (Sandbox Code Playgroud)

这将是0或1什么都不做,2或3打印命中... To构造是一个范围...

这是MSDN


use*_*143 10

编辑: 我认为假设VB.NET不允许Case ORing是错误的.我在C#和IL中思考,看来我错了.

然而,正如有人指出的那样,你的代码不起作用的原因是因为案例2或3正在评估2或3作为按位或因此评估案例3.

为了澄清:


       2 binary = 0000 0010
       3 binary = 0000 0011
  2 Or 3 binary = 0000 0011 (= 3)
Run Code Online (Sandbox Code Playgroud)

  Select Case 2
     Case 0            '--> no match

     Case 1            '--> no match

     Case 2 Or 3       '(equivalent to Case 3  --> no match)
   End Select
Run Code Online (Sandbox Code Playgroud)

但是,我觉得我应该指出,为了表现,不应该使用这样的结构.当编译器遇到Select语句(在C#中切换)时,它将尝试使用查找表和切换 MSIL指令编译它们,但是如果你有类似案例1,2,11,55情况,编译器将无法转换到查找表,它将不得不使用一系列比较(这就像使用If .. Else).

关键是,为了真正利用Select语句,应该考虑到这些案例.否则,唯一的好处是代码可读性.

设计良好的开关是O(1)操作,而设计不良的开关(相当于一系列If..Then..Else语句)是O(n)操作.