VB.NET中像C#/Java的Switch一样堆叠Select Case语句

24

似乎如果我把这些Case堆在一起,它们不会作为一个整体工作。由于VB.NET中的Cases不需要使用Exit Select / Return,因此每次检测到新的Case时似乎会自动将其放置在下面?

Dim Test as Integer = 12

Select Case Test
  Case 11
  Case 12
  Case 13
    MsgBox.Show("Could be 11 or 12 or 13?")
End Select

只有13个起作用,看起来不行。

现在必须时刻记住这条规则,不能像这样堆叠Cases
在移植应用程序时,要记住它并不容易。


dotnet perls 网站 带我遇到了同样的错误... - Zac
哈哈,是的,有人必须向那个网站报告他们搞错了。 - SSpoke
1
只有当你认为C语言的方式是“正确”的,而其他不像C语言的方式是“错误”的时候,它才会“不起作用”。这就好比说,如果在VB中使用大括号来标记循环的开始和结束导致出现错误消息,那么你也可以说VB不起作用。 :-) - Jay
1个回答

36

你的理解是正确的。VB不会“穿透”。

指定单个Case并用逗号分隔每个表达式:

Select Case Test
    Case 11, 12, 13
        MsgBox.Show("Could be 11 or 12 or 13?")
End Select

或者,您可以使用范围和 To 关键字来达到相同的效果:

Select Case Test
    Case 11 To 13
        MsgBox.Show("Could be 11 or 12 or 13?")
End Select

了解更多信息,请参阅文档


1
谢谢。如果它们都为空,它应该检测上面的模式,但是再次使用它作为忽略过滤器的能力将会丢失。 - SSpoke
这是有争议的。我可能会同意,因为我习惯了这种模式,但对许多VB人来说可能会很困惑。考虑一下在case之后只有一个语句的情况,在调试期间你将其注释掉。因为VB不需要“break”,所以很难解释新行为——为什么它开始穿透。这不是显式的行为,也不清楚看代码。 - lc.
1
现在想想,他们可能不应该改成“now”,因为它是BASIC从一开始就使用的部分,而且似乎通过一个比开关更好的功能来弥补这个问题,只看过相关线程中的 < > 比较,非常强大。必须始终记住这个规则,从现在开始不能将它们堆叠起来,在移植应用程序时很难记住。 - SSpoke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接