2012-04-19 15 views
5

Duplicar posible:
Bug?? If you assign a value to a nullable integer via a ternary operator, it can't become null¿Cuál es el equivalente de VB.NET de la palabra clave predeterminada de C#?

Aunque esta pregunta puede parecer como un duplicado de muchos, en realidad se le pide por una razón específica. Tome este código, por ejemplo:

Dim n As Integer? = If(True, Nothing, 1) 

En ese código, la expresión ternaria debe regresarán nada, pero está configurando n a 0. Si esto fuera C#, podría decir default(int?) y que iba a funcionar perfectamente. Ahora parece que tendré que abandonar el ternario y usar un bloque If normal, pero realmente quiero usar el ternario.

Si nada fuera realmente el equivalente de VB.NET al predeterminado de C#, ¿cómo se puede explicar este comportamiento?

+0

'Nothing 'en este caso equivale a' default (int) 'porque su tipo inferido basado en la expresión es' int', no 'int?'. Esto se puede ver con 'If (true, Nothing, new Integer? (1))' – Marc

+0

Por lo tanto, es seguro decir que VB.NET * no * tiene el equivalente de C# por defecto. Si lo hiciera, podría haber utilizado la inferencia de tipo para determinar que Nothing, en este caso, equivale a un valor por defecto de un entero nulo que es Nothing, no 0. – oscilatingcretin

+0

De forma indirecta, eso es correcto. En C#, el 'predeterminado' toma un tipo, que se puede usar para inferir. En VB, parece que 'Nothing' juega el papel pasivo en esto. – Marc

Respuesta

6

El VB.NET equivalente a C# 's default es la palabra clave Nothing. El código que escribió debe compilarse correctamente siempre que Id.Value devuelva un valor de Integer.

El motivo por el que su muestra actualizada está fallando es debido a la naturaleza de Nothing. En VB.NET Nothing es el valor vacío y es convertible a cualquier tipo. Ahora, para una expresión If, el compilador debe inferir cuál debe ser el tipo de retorno, y lo hace observando los dos argumentos de valor.

El valor Nothing no tiene ningún tipo, pero el literal 1 tiene el tipo Integer. Nothing es convertible a Integer por lo que el compilador determina Integer es el mejor tipo aquí. Esto significa que cuando se elige Nothing como el valor, se interpretará como Integer y no como Integer?.

La manera más fácil de solucionar esto es indicar explícitamente al compilador que desea que 1 se trate como Integer?.

+0

En mi pregunta, ¿estoy usando Nothing en la expresión ternaria correctamente? Si no, ¿cómo lo modificarías para hacer lo que estoy intentando? ¿Ha intentado, por casualidad, reproducir el problema usando su propio código? – oscilatingcretin

+0

@oscilatingcretin el código que estás usando está bien. Escribí una muestra localmente y funcionó como esperaba – JaredPar

+0

Bien, entonces pruebe el código actualizado que edité en mi pregunta. Cuando ejecuta esa única línea de código, 'n' se establece en Nothing como se esperaba? Cuando lo ejecuto, se establece en 0. – oscilatingcretin

Cuestiones relacionadas