我在我的case表达式中使用了Or语句.
即使我有一个在此范围内的值,它也找不到匹配项.为什么不?
示例代码:
Select Case 2 Case 0 ' Some logic Case 1 ' Some other logic Case 2 Or 3 Console.WriteLine("hit") End Select
有了上面我会假设hit
将打印,但事实并非如此.
使用逗号运算符分隔case语句
Select Case 2 Case 0,1,2,3 Console.WriteLine("hit") End Select
正如Jared所说,您需要使用逗号运算符来分隔case语句.
将Or
你在做一个按位OR,导致它成为"3".有趣的是,"2和3"可能适用于您的具体案例.
JaredPar没错,但您也可以使用To构造
Select Case 2 Case 0,1 Case 2 To 3 Console.WriteLine("Hit") End Select
这将是0或1什么都不做,2或3打印命中... To构造是一个范围...
这是MSDN
编辑: 我认为假设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)
Select Case 2 Case 0 '--> no match Case 1 '--> no match Case 2 Or 3 '(equivalent to Case 3 --> no match) End Select
但是,我觉得我应该指出,为了表现,不应该使用这样的结构.当编译器遇到Select语句(在C#中切换)时,它将尝试使用查找表和切换 MSIL指令编译它们,但是如果你有类似案例1,2,11,55的情况,编译器将无法转换到查找表,它将不得不使用一系列比较(这就像使用If .. Else).
关键是,为了真正利用Select语句,应该考虑到这些案例.否则,唯一的好处是代码可读性.
设计良好的开关是O(1)操作,而设计不良的开关(相当于一系列If..Then..Else语句)是O(n)操作.