Un peu une question bizarre ...
Mais est-ce que quelqu'un peut me donner une raison pour laquelle ce serait un comportement attendu?
Cela me semble tout à fait étrange ...
//Makes perfect sense
object o = null;
o.GetHashCode().Dump();
NullReferenceException: référence d'objet non définie sur une instance d'un objet.
//Seems very odd
int? i = null;
i.GetHashCode().Dump();
Cela signifie évidemment:
int? zero = 0;
int? argh = null;
zero.GetHashCode() == argh.GetHashCode(); //true
Le point ici est que
int? i = null;
ne crée pas une variable i
qui est null
, mais (en effectuant un transtypage implicite) un Nullable<int>
instance qui n'a pas de valeur.
Cela signifie que l'objet/l'instance n'est pas null
(et que Nullable<T>
est un type struct/valeur, il ne peut en fait pas être null
) et doit donc renvoyer un code de hachage.
Ceci est également documenté ici :
Le code de hachage de l'objet retourné par la propriété Value si la propriété HasValue est true, ou zéro si la propriété HasValue est false.
int?
est en fait juste un raccourci pour Nullable<int>
, une structure qui enveloppe le type int
afin de lui permettre d'être nul. Nullable peut être utilisé avec n'importe quel type de valeur.
Parce que Nullable est en fait un struct (il ne peut pas être nul), il doit retourner quelque chose pour un code de hachage, et normalement il retournerait la valeur de code de hachage (probablement pour être aussi transparent que possible à la valeur à l'intérieur). Lorsque la valeur est nulle, elle est codée en dur pour retourner 0 par défaut:
public override int GetHashCode() {
return hasValue ? value.GetHashCode() : 0;
}
Voir ici .
Il ressemble au comportement documenté de Nullable<T>.GetHashCode()
, comme le dit la documentation :
Le code de hachage de l'objet retourné par la propriété Value si la propriété HasValue est true, ou zéro si la propriété HasValue est false.