39 votes

Pourquoi un `null` Nullable <T> avoir un code de hachage?

Petite question étrange ...

Mais peut-on me justifier pourquoi ce comportement serait attendu?

Cela me semble tout à fait étrange ....

 //Makes perfect sense
object o = null;
o.GetHashCode().Dump();
 

NullReferenceException: La référence à un objet n'est pas définie sur une instance d'un objet.

 //Seems very odd
int? i = null;
i.GetHashCode().Dump();
 

0

Cela signifie évidemment:

 int? zero = 0;
int? argh = null;

zero.GetHashCode() == argh.GetHashCode(); //true
 

46voto

ChrFin Points 8254

Le point ici est que

int? i = null;

ne pas créer une variable i qui null, mais (en effectuant un cast implicite) un Nullable<int> instance qui n'ont pas de valeur.
Cela signifie que l'objet ou de l'instance n'est pas null (et en tant que Nullable<T> est une struct/type de valeur peut pas être null) et, par conséquent, doit retourner un hash-code.

Cela est également documenté ici:

Le code de hachage de l'objet renvoyé par la Valeur de la propriété si la propriété HasValue est vrai, ou zéro si la propriété HasValue est faux.

14voto

John Points 13259

int? est en fait juste un raccourci pour Nullable<int>, une structure qui enveloppe l' int type afin de lui permettre d'être nulle. Prendre la valeur null peut être utilisé avec n'importe quel type de valeur.

Parce que Nullable est en fait un struct (il ne peut pas être null), elle doit retourner quelque chose pour un code de hachage, et normalement, il serait de retour la valeur de code de hachage de l' (probablement dans le but d'être aussi transparent que possible de la valeur à l'intérieur). Lorsque la valeur est null, il est codé en dur pour retourner la valeur 0 par défaut:

public override int GetHashCode() {
    return hasValue ? value.GetHashCode() : 0;
}

Voir ici.

8voto

gabba Points 574

Cela ressemble à un comportement documenté de Nullable<T>.GetHashCode() , comme le dit la documentation :

Code de hachage de l'objet renvoyé par la propriété Value si la propriété HasValue est true ou zéro si la propriété HasValue est false.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X