C'è qualche differenza tra il tipo?e Nullable<tipo>?
Domanda
In C# ci sono i tipi primitivi nullable (ad es. bool?
) sono solo alias per i loro corrispondenti Nullable<T>
tipo o c'è differenza tra i due?
Soluzione
Se guardi l'IL utilizzando Ildasmo, scoprirai che entrambi vengono compilati fino a Nullable<bool>
.
Altri suggerimenti
Non c'è differenza tra bool? b = null
E Nullable<bool> b = null
.IL ?
è solo lo zucchero della sintassi del compilatore C#.
Per accedere al valore del bool?devi fare quanto segue:
bool? myValue = true;
bool hasValue = false;
if (myValue.HasValue && myValue.Value)
{
hasValue = true;
}
Nota che non puoi semplicemente fare:
if (myValue)
{
hasValue = true;
}
Sono sorpreso che nessuno sia ancora andato alla fonte (le specifiche C#).Da §4.1.10 Tipi nullable:
Un tipo nullable viene scritto T?, dove T è il tipo sottostante.Questa sintassi è un'abbreviazione di System.Nullable<T> e le due forme possono essere utilizzate in modo intercambiabile.
Quindi no, non c'è alcuna differenza tra le due forme.(Supponendo che tu non abbia nessun altro tipo chiamato Nullable<T>
in uno qualsiasi degli spazi dei nomi che utilizzi.)
UN Nullable<T>
è una struttura composta da una T e un flag di bit che indica se la T è valida o meno.UN Nullable<bool>
ha tre possibili valori:vero, falso e nullo.
Modificare: Ah, mi era sfuggito il fatto che il punto interrogativo dopo "bool" fosse in realtà parte del nome del tipo e non un indicatore del fatto che stavi facendo una domanda :).La risposta alla tua domanda, quindi, è "sì, il C# bool?
è solo un alias per Nullable<bool>
".
UN bool
è un tipo valore, pertanto non può contenere un valore NULL.Se avvolgi qualsiasi tipo di valore con Nullable<>
, gli darà quella capacità.Inoltre, i metodi di accesso al valore cambiano tramite proprietà aggiuntive HasValue
E Value
.
Ma alla domanda: Nullable<bool>
E bool?
sono alias.
No, non c'è differenza.In sintesi:
System.Boolean -> valori validi:vero falso
bool -> alias per System.Boolean
Nullable<bool> -> valori validi:vero, falso, nullo
bool?-> alias per Nullable<bool>
Spero che questo ti aiuti.
Le primitive nulle sono solo primitive regolari racchiuse in Nullable.Qualsiasi apparenza contraria è solo il compilatore e lo zucchero sintattico.
Nessuna differenza.Dai un'occhiata qui: http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx
"La sintassi T?è una scorciatoia per Nullable, dove T è un tipo di valore.Le due forme sono intercambiabili."