En última instancia, son simplemente una estructura genérica con una bandera bool, excepto con reglas especiales de boxeo. Debido a que las estructuras son (por defecto) inicializado a cero, los valores por defecto bool false (sin valor):
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); }
}
diferencias adicionales, sin embargo:
- reglas especiales de boxeo (normalmente no puede hacer esto)
- reglas especiales C# para comparar a null etc
- "levantadas" operadores en C# (y en .NET través
EqualityComparer<T>
, Comparer<T>
etc)
- normas especiales sobre g restricciones de tipo eneric (para evitar
Nullable<Nullable<T>>
)
shameless plug: Escribí una publicación de blog sobre cómo funciona hace un tiempo: http://softwareblog.alcedo.com/post/2010/02/16/Nullable3cT3e-vs-null.aspx –
@ FredrikMörk El enlace ya no está disponible ... –
@ M.Mimpen Ahora está disponible de nuevo. Ese blog se estrelló contra mí hace un tiempo, pero lo he vuelto a publicar en otro lado, pero tengo redirecciones para las url originales. –