2009-01-09 14 views
36

que estoy haciendo un poco de depuración, y así lo desea registrar el valor eventArgsEl uso de VB.NET IIF me sale NullReferenceException

Tengo una línea simple que básicamente hace:

logLine = "e.Value: " + IIf(e.Value Is Nothing, "", e.Value.ToString()) 

La forma en que comprender la función IIF, si e.Value es Nothing (null), entonces debería devolver la cadena vacía, si no debería devolver el .ToString del valor. Sin embargo, recibo una NullReferenceException. Esto no tiene sentido para mí.

¿Alguna idea?

Respuesta

68

IIf es una función real, por lo que se evalúan todos los argumentos. La palabra clave If se agregó a VB.NET 2008 para proporcionar la funcionalidad de cortocircuito que está esperando.

Trate

logLine = "e.Value: " + If(e.Value Is Nothing, "", e.Value.ToString()) 
+5

También: Si() es typesafe. IIf() no es. –

+0

Todavía tengo problemas con el cortocircuito Si con tipos como Fecha y Boolean y aún así asignar a un tipo que admite nulos. Por ejemplo, quiero devolver 'Nada' como en el ejemplo anterior a un valor booleano Nullable usando 'If' pero aún así devuelve 'False'. Loco cuando rompo las líneas en un If-Else-End si la lógica funciona como se esperaba. – atconway

+2

@atconway, aparentemente 'Nothing' en VB es como' default' en C#, en lugar de 'null', así que cuando se usa en un contexto donde' Boolean' es el tipo implícito, su valor es 'False' en vez de' null'/'Nada' como normalmente lo pensaría (de acuerdo con http://stackoverflow.com/q/1828173/2688). Tendrá que convertir un lado del 'If' en el tipo correcto (por ejemplo,' Boolean? ') Para obtener el resultado deseado. Del mismo modo, en C#, necesita lanzar un lado (pero es un error de compilación si no lo hace). – bdukes

3

VB no realiza una evaluación de cortocircuito en Iif. En su caso, e.Value.ToString() se está evaluando sin importar si e.Value no es nada.

3

Este es el comportamiento esperado.

IIF es una función; por lo tanto, los parámetros de la función se evaluarán antes de enviarlos a la función.

En contraste, el operador ternario en C# es una construcción de lenguaje que impide la evaluación del segundo parámetro si la expresión del ternario es verdadera.

Cuestiones relacionadas