funciona en VB 2005 (dotnet 2,0), pero es feo.
No puede usarlo como una variable normal, pensé que podría funcionar como un tipo de objeto pero no es así.
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
sufre esta enfermedad.
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 la variable es nula y le sucede a invocar la propiedad Value se barfs hasta una excepción no controlada.
por lo que, por ejemplo, mi favorito es este.
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value))
Causará un error de tiempo de ejecución cuando su valor de Supposed Nullable sea nulo.
Así que aquí está anulable (de número entero) vs Código objeto
anulable (de número 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)
La equivalencia nula y el boxeo funcionaron en VB 2005. Los cambios en 2008 se centraron en agregar el "?" sintaxis, y la implementación del levantamiento del operador. Una cosa a tener en cuenta, sin embargo, es ese apoyo para el "?" la sintaxis no se agregó al Modelo de código VS/Código DOM, de modo que cualquier código generado por el diseñador que use tipos anulables siempre usará la sintaxis genérica antigua. –