Historia de la sintaxis de Nullable VB.NET
Pregunta
No puedo encontrar una respuesta definitiva. Desde C # 2.0 has podido declarar
int? i = 125;
como taquigrafía para
Nullable<int> i = Nullable<int>(123);
Recuerdo haber leído en alguna parte que VB.NET no permitía este acceso directo. Pero bajo y he aquí, lo probé en VS 2008 hoy y funciona.
¿Alguien sabe si ha sido así desde .NET 2.0 o se agregó más tarde?
Solución
System.Nullable se introdujo en .Net 2.0 y está disponible para VB como un tipo genérico . Simplemente no puedes usar la sintaxis que puede ser nula. Así que en VS 2005 puedes hacer:
Dim x as Nullable(of Integer)
No sé si la equivalencia nula y el boxeo funcionan para nullables en VB 2005, pero sospecho que la respuesta es sí, ya que el equipo de .Net realizó un cambio en el CLR 2.0 para lograr el boxeo con nullables. Me imagino que VB aprovecha esto.
En 2008, obviamente puedes hacerlo:
Dim x as Integer?
Otros consejos
funciona en VB 2005 (dotnet 2.0) pero es feo.
No puedes usarlo como una variable normal, pensé que podría funcionar como un tipo de Objeto pero no lo hace.
En lugar de esto:
dim oInt as object
dim i as integer
if oInt is nothing then
msgbox("int is null")
else
i = cint(oInt)
end if
tienes esto.
Dim oInt as nullable(of integer)
dim i as integer
if oInt.HasValue = false then
msgbox("int is null")
else
i = oInt.Value
end if
El problema aquí es que si su variable es nula y usted invoca la propiedad Value, presenta una excepción no controlada.
así, por ejemplo, mi favorito es este.
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value))
¡Resultará en un error de tiempo de ejecución cuando su valor de Nullable Supuesto sea nulo!
así que aquí hay nullable (de entero) vs código de objeto
anulable (de entero)
if oInt.HasValue then
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt.Value)
else
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, dbnull.value)
end if
objeto
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt)
IIRC, los tipos anulables se introdujeron en .NET 2.0 en una etapa muy tardía. El equipo del compilador de C # logró incluir más soporte de idiomas para ellos que el equipo de VB.NET. El equipo de VB.NET más o menos atrapado en VS2008. Es por eso que puede, por ejemplo, usar el operador == para comparar nullables en C # 2.0 mientras que en VB.NET tuvo que soportar el método Nullable.Equals (). Grrr.
No conozco la historia, pero sí, fue una mejora de VS 2008.