La razón por la que falla la compilación en el ejemplo es el orden de las operaciones.
El analizador de expresiones está intentando evaluar primero "dbnull.value o temp".
if temp is (dbnull.value or temp) = 0
El error está aquí, porque no puede hacer un OR bit a bit entre un entero (temp) y dbnull.value.
OrElse corrige esto, no porque esté cortocircuitado, sino porque es más bajo en el orden de las operaciones , por lo que "temp is dbnull.value" y "3 = 0" se evalúan primero, en lugar de que el analizador intente comparar dbNull y temperatura
Entonces, la evaluación con OrElse funciona como espera: (suponga 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
Esto fue en realidad en un examen de ingreso en una empresa de software para la que solía trabajar, y era un problema común que solía encontrar en VB6. Por lo tanto, es una buena idea poner entre paréntesis las subexpresiones cuando se usan operadores booleanos:
Esto se habría compilado correctamente:
if (temp is dbnull.value) Or (temp = 0) then
Aunque, como ya han señalado todos, OrElse y AndAlso son realmente los operadores correctos para usar en este contexto.