/ / ¿¿Insecto?? Si asigna un valor a un entero anulable a través de un operador ternario, no puede volverse nulo - vb.net, nullable, ternary-operator

¿¿Error?? Si asigna un valor a un entero nullable a través de un operador ternario, no puede convertirse en nulo - vb.net, nullable, ternary-operator

dim val1 As Integer? = If(5 > 2, Nothing, 43)
" val1 = 0

dim val1 As Integer? = If(5 > 2, Nothing, Nothing)
" val1 = Nothing

¿Lo que da? ¿Es esto un error, o estoy pasando por alto algo?

Respuestas

13 para la respuesta № 1

El problema es ese Nothing en VB.NET funciona de manera diferente a, por ejemplo, null Cía#. Cuando Nothing se utiliza en el contexto de un tipo de valor (como Integer) representa el valor por defecto de ese tipo. En este caso, esa "s 0.

En su primer ejemplo, ambas ramas del operador ternario son válidas Integer valores. La rama verdadera representa 0 y la rama falsa representa 43.

En el segundo ejemplo, ninguna rama del operador ternario es válida Integer valor, lo que obliga al compilador VB.NET a asumir que el operador general devuelve Objectno Integer.

Para que el primer ejemplo funcione de la manera que usted pretende, debe dejarle claro al compilador que el operador ternario debe resolver a un Integer?, no un Integer o un Object. Puedes hacerlo así:

dim val1 As Integer? = If(5 > 2, Nothing, New Integer?(43))

Haciendo explícitamente la rama falsa del operador una Integer?, el Nothing en la rama verdadera representará el valor nulo, en lugar del valor predeterminado Integer valor.