Редактировать: Похоже, я ошибался, предполагая, что 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 (switch в C #), он попытается скомпилировать их, используя таблицы поиска и инструкцию switch MSIL, но в случае, когда у вас есть что-то вроде Case 1,2,11,55 компилятор не сможет преобразовать это в таблицу поиска, и ему придется использовать серию сравнений (что аналогично использованию If .. Else).
Суть в том, что для того, чтобы действительно воспользоваться предложением Select, случаи должны быть разработаны с учетом этого. В противном случае единственным преимуществом является удобочитаемость кода.
Хорошо спроектированный переключатель - это операция O (1), тогда как плохо спроектированный (который эквивалентен серии операторов If..Then..Else) - это операция O (n).