Me estoy haciendo un poco de depuración, y así quiero registro de la eventArgs valor

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

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

Mi manera de entender la función IIF, si el correo.El valor no es Nada (null) entonces debe devolver una cadena vacía, si no se debe devolver el .ToString del valor. Sin embargo estoy recibiendo una excepción NullReferenceException. Esto no tiene sentido para mí.

Alguna idea?

InformationsquelleAutor Nathan Koop | 2009-01-09

3 Comentarios

  1. 75

    IIf es una función real, por lo que todos los argumentos obtener evaluados. El Si palabra clave se ha añadido VB.NET 2008 para proporcionar el corto-circuito de la funcionalidad que usted está esperando.

    Intentar

    logLine = "e.Value: " + If(e.Value Is Nothing, "", e.Value.ToString())
    • También: Si() es typesafe. IIf() no lo es.
    • Todavía tengo problema con el circuito corto, Si con tipos como la Fecha y Booleanos y, aun así, la asignación a un tipo que acepta valores null. Por ejemplo yo quiero volver ‘Nada’ como antes a un Boolean que acepta valores null valor de uso ‘Si’, pero todavía se devuelve ‘False’. Cosa loca cuando me rompen las líneas de salida a un If-Else-End If la lógica funciona como se esperaba.
    • al parecer Nothing en VB es como default en C#, en lugar de null, así que cuando se usa en un contexto donde Boolean es la implícita tipo, su valor es False en lugar de null/Nothing como normalmente lo pienso de ella (por stackoverflow.com/q/1828173/2688). Usted necesita para lanzar un lado de la If para el tipo correcto (por ejemplo,Boolean?) para obtener el resultado deseado. De manera similar, en C#, usted necesita para lanzar un lado (pero es un error de compilación si no).
  2. 3

    VB no hacer cortocircuito en la evaluación Iif. En su caso, correo.Valor.ToString() está siendo evaluado no importa si el correo.El valor no es nada.

  3. 3

    Este es el comportamiento esperado.

    IIF es una función; por lo tanto, los parámetros para la función que va a ser evaluado antes de su envío a la función.

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

Dejar respuesta

Please enter your comment!
Please enter your name here