El símbolo ?
después de un tipo es solo un acceso directo al Nullable type, bool?
es equivalente a Nullable<bool>
.
bool
es una value type, esto significa que no puede ser null
, por lo que el tipo anulable básicamente le permite envolver los tipos de valor, y ser capaz de asignar null
a ellos.
bool?
puede contener tres valores diferentes: true
, false
y null
.
También, no hay operadores de cortocircuito (& & ||) definidos para bool?
Sólo la lógica AND, OR inclusivo, los operadores se definen y se comportan como este:
x y x & y x | y
true true true true
true false false true
true null null true
false true false true
false false false false
false null false null
null true null true
null false false null
null null null null
El tipo Nullable es básicamente una estructura genérica, que tiene las siguientes propiedades públicas:
public struct Nullable<T> where T: struct
{
public bool HasValue { get; }
public T Value { get; }
}
La propiedad HasValue
indica si el objeto actual tiene un valor, y la propiedad Value
obtendrá el valor actual del objeto, o si HasValue es falso, arrojará una InvalidOperationException.
Ahora debe estar preguntándose algo, Nullable es una estructura, un tipo de valor que no puede ser nulo, entonces ¿por qué la siguiente declaración es válida?
int? a = null;
Ese ejemplo se compilará en esto:
.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0)
IL_0000: ldloca.s V_0
IL_0002: initobj valuetype [mscorlib]System.Nullable`1<int32>
Una llamada a initobj, que inicializa cada campo del tipo de valor en una dirección especificada para una referencia nula o un 0 del tipo primitivo apropiado .
Eso es todo, lo que está sucediendo aquí es el predeterminado struct initialization.
int? a = null;
es equivalente a:
Nullable<int> a = new Nullable<int>();
posible duplicado de [¿Qué significa "DateTime?" significa en C#?] (http://stackoverflow.com/questions/109859/what-does-datetime-mean-in-c) – nawfal