2008-10-21 17 views
5

Non riesco a trovare una risposta definitiva. Dal momento che C# 2.0 è stato in grado di dichiarareCronologia della sintassi VB.NET Nullable

int? i = 125; 

come abbreviazione di

Nullable<int> i = Nullable<int>(123); 

Ricordo letto da qualche parte che VB.NET non ha permesso questa scorciatoia. Ma basso ed ecco, l'ho provato in VS 2008 oggi e funziona.

Qualcuno sa se è stato così da .NET 2.0 o è stato aggiunto in seguito?

risposta

13

System.Nullable è stato introdotto in .Net 2.0 ed è disponibile per VB come tipo generico. Non puoi semplicemente usare la sintassi nullable. Quindi, in VS 2005 si può fare:

Dim x as Nullable(of Integer) 

non so se l'equivalenza nullo e la boxe lavora per nullables in VB 2005, ma ho il sospetto che la risposta è sì in quanto la squadra Net ha fatto una modifica a il CLR 2.0 per realizzare il pugilato con nullable. Immagino che VB faccia leva su questo.

Nel 2008, ovviamente è possibile solo fare:

Dim x as Integer? 
+0

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. –

0

Non conosco la cronologia, ma sì è stato un miglioramento VS 2008.

+0

Perché mai questa è una risposta accettata? –

3

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) 
+1

Un modo più semplice per aggiungere il parametro sarebbe utilizzare il "nuovo" operatore "If": AddParamToSQLCmd (sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, If (oInt.HasValue, oInt.Value, DBNull.value)) La ragione per cui questo funziona è che If è un operatore di circuito ahort mentre entrambi i lati di una chiamata di metodo IIf vengono valutati, indipendentemente dal fatto che il primo operando valuti su true. –

1

IIRC, tipi nullable sono state introdotte in .NET 2.0 in un molto tardi. Il team del compilatore C# è riuscito a trovare più supporto linguistico per loro rispetto al team VB.NET. Il team VB.NET più o meno coinvolto in VS2008. Ecco perché è possibile, ad esempio, utilizzare l'operatore == per confrontare il nullable in C# 2.0 mentre in VB.NET si è dovuto accettare il metodo Nullable.Equals(). Grrr.