J'utilise une instruction Or dans mon expression de cas.
Même si j'ai une valeur dans cette plage, il n'a pas trouvé de correspondance. Pourquoi pas?
Exemple de code :
Select Case 2
Case 0
' Some logic
Case 1
' Some other logic
Case 2 Or 3
Console.WriteLine("hit")
End Select
Avec ce qui précède, je suppose que hit
serait imprimé, mais ce n'est pas le cas.
Utilisez l'opérateur virgule pour délimiter les instructions de casse
Select Case 2
Case 0,1,2,3
Console.WriteLine("hit")
End Select
Comme Jared l'a dit, vous devez utiliser l'opérateur virgule pour délimiter les déclarations de casse.
Le Or
que vous faisiez est un OU au niveau du bit, ce qui en fait "3". De manière amusante, "2 ET 3" aurait probablement fonctionné pour votre cas spécifique.
JaredPar a raison, mais vous pouvez également utiliser la construction To
Select Case 2
Case 0,1
Case 2 To 3
Console.WriteLine("Hit")
End Select
Ce serait 0 ou 1 ne rien faire, 2 ou 3 Imprimer Hit ... La construction To est une plage ...
Edit: Il semble que j'ai eu tort de supposer que VB.NET n'autorise pas l'OR de casse. Je pensais en C # et IL et il semble que j'avais tort.
Cependant, comme quelqu'un l'a souligné, la raison pour laquelle votre code n'a pas fonctionné était que le cas 2 ou 3 évaluait 2 ou 3 au niveau du bit ou et donc évaluait le cas 3.
Pour clarification:
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
Cependant, je pense que je dois souligner que, pour des raisons de performance, il ne faut pas utiliser de telles constructions. Lorsque le compilateur rencontre des instructions Select (commutateur en C #), il essaie de les compiler en utilisant des tables de recherche et le commutateur MSIL mais dans le cas où vous avez quelque chose comme Cas 1,2,11,55 le compilateur ne sera pas en mesure de convertir cela en une table de recherche et devra utiliser une série de comparaisons (ce qui revient à utiliser If .. Else).
Le fait est que pour vraiment profiter de l'instruction Select, les cas doivent être conçus dans cet esprit. Sinon, le seul avantage est la lisibilité du code.
Un commutateur bien conçu est une opération O(1)) alors qu'un commutateur mal conçu (qui équivaut à une série d'instructions If..Then..Else) est un O(n).
Cela vous permettra d'effectuer "quelque chose" dans le cas de 0, "autre chose" dans le cas de 1, "hit" dans le cas de 2 ou 3 ou "hit else" sinon.
Select Case 2
Case 0
Console.WriteLine("something")
Case 1
Console.WriteLine("something else")
Case Is 2 To 3
Console.WriteLine("hit")
Else
Console.WriteLine("hit else")
End Select