L' ?
symbole après un type n'est qu'un raccourci vers le type Nullable, bool?
est équivalent à Nullable<bool>
.
bool
est un type de valeur, ce qui signifie qu'il ne peut pas être null
, de sorte que le type Nullable fondamentalement vous permet d'emballer types de valeurs, et d'être en mesure d'attribuer null
d'entre eux.
bool?
peut contenir trois valeurs différentes: true
, false
et null
.
Aussi, il n'y a pas de court-circuiter les opérateurs (&& ||) définie pour l' bool?
Seule la logique ET, inclusive OU, les opérateurs sont définis et ils se comportent comme ceci:
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
Le type Nullable est fondamentalement un générique struct, qui a la suite de propriétés publiques:
public struct Nullable<T> where T: struct
{
public bool HasValue { get; }
public T Value { get; }
}
L' HasValue
propriété indique si l'objet a une valeur, et l' Value
propriété sera d'obtenir la valeur actuelle de l'objet, ou si HasValue est faux, il va lever une exception InvalidOperationException.
Maintenant vous devez vous demander quelque chose, Nullable est une structure, un type de la valeur qui ne peut pas être null, alors pourquoi l'instruction suivante est valide?
int? a = null;
Cet exemple permettra de compiler dans ce:
.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>
Un appel à initobj, qui initialise chaque champ du type de valeur à une adresse spécifiée à une référence null ou 0 du type primitif.
C'est ça, ce qui se passe ici est la valeur par défaut de structure de l'initialisation.
int? a = null;
Est équivalent à:
Nullable<int> a = new Nullable<int>();