funziona in VB 2005 (dotnet 2.0), ma è brutto.
Non è possibile utilizzarlo come una variabile normale, ho pensato che potrebbe funzionare come un tipo di oggetto, ma non è così.
Invece di questo:
dim oInt as object
dim i as integer
if oInt is nothing then
msgbox("int is null")
else
i = cint(oInt)
end if
si dispone di questo.
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
Il problema qui è che se la variabile è nulla e vi capita di invocare la proprietà Value è barfs fino un'eccezione non gestita.
quindi, ad esempio, il mio preferito è questo.
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value))
Comporterà un errore di runtime quando il valore Supposed Nullable è nullo !!!
quindi ecco nullable (di numero intero) vs Codice oggetto
nullable (di numero intero)
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
oggetto
AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt)
L'equivalenza e il pugilato nulli hanno funzionato in VB 2005. Le modifiche nel 2008 si sono concentrate sull'aggiunta del "?" sintassi e implementazione dell'operatore di sollevamento. Una cosa da notare, però, è il supporto per "?" la sintassi non è stata aggiunta al VS Code Model/Code DOM, quindi qualsiasi codice generato dal designer che utilizza i tipi nullable utilizzerà sempre la vecchia sintassi generica. –