In definitiva, sono solo una struttura generica con un flag bool - tranne con regole di boxing speciali. Poiché le strutture sono (per impostazione predefinita) inizializzato a zero, le impostazioni predefinite bool false (nessun valore):
public struct Nullable<T> where T : struct {
private readonly T value;
private readonly bool hasValue;
public Nullable(T value) {
this.value = value;
hasValue = true;
}
public T Value {
get {
if(!hasValue) throw some exception ;-p
return value;
}
}
public T GetValueOrDefault() { return value; }
public bool HasValue {get {return hasValue;}}
public static explicit operator T(Nullable<T> value) {
return value.Value; }
public static implicit operator Nullable<T>(T value) {
return new Nullable<T>(value); }
}
differenze aggiuntivi, però:
- regole speciali boxe (non si può normalmente fare questo)
- regole speciali C# per il confronto su null ecc
- operatori "sollevato" in C# (e in .NET tramite
EqualityComparer<T>
, Comparer<T>
ecc)
- regole speciali su g vincoli di tipo enerica (per evitare
Nullable<Nullable<T>>
)
fonte
2010-03-23 21:39:40
plug spudorato: ho scritto un post sul blog su come funziona un po 'di tempo fa: http://softwareblog.alcedo.com/post/2010/02/16/Nullable3cT3e-vs-null.aspx –
@ FredrikMörk Il link non è più disponibile ... –
@ M.Mimpen Ora è di nuovo disponibile. Quel tipo di blog si è schiantato su di me qualche tempo fa, ma ho ripubblicato altrove, ma ho reindirizzamenti per l'url originale. –