web-dev-qa-db-fra.com

Pourquoi un Nullable <T> nul a-t-il un code de hachage?

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
38
Dave Bish

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.

47
ChrFin

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 .

16
John

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.

8
gabba