La raison pour laquelle la compilation échoue dans l'exemple est que l'ordre des opérations.
L'analyseur d'expression essaie d'évaluer d'abord "dbnull.value or temp".
if temp is (dbnull.value or temp) = 0
L'erreur est ici, parce que vous ne pouvez pas faire un OU bit à bit entre un entier (temp) et dbnull.value.
OrElse résout ce problème, non pas parce qu'il est court-circuité, mais parce qu'il est plus bas dans l'ordre des opérations Ainsi, "temp est dbnull.value" et "3=0" sont évalués en premier, plutôt que l'analyseur syntaxique n'essaie de comparer dbNull et temp.
Donc l'évaluation avec OrElse fonctionne comme vous l'attendez : (suppose que temp=3)
if temp is dbnull.value OrElse temp = 0 then
if 3 is dbnull.value OrElse 3 = 0 then
if false OrElse 3=0 then
if false OrElse false then
if false then
Il s'agissait en fait d'un examen d'entrée dans une société de logiciels pour laquelle je travaillais, et c'était un problème courant que je rencontrais en VB6. C'est donc une bonne idée de mettre entre parenthèses vos sous-expressions lorsque vous utilisez des opérateurs booléens :
Cela aurait compilé correctement :
if (temp is dbnull.value) Or (temp = 0) then
Bien que, comme tout le monde l'a déjà souligné, OrElse et AndAlso sont vraiment les opérateurs corrects à utiliser dans ce contexte.