visual valores valor utilice tipo tener significado que puede programacion objeto net debe dato convertir acepte acepta c# nullable

c# - valores - ¿Por qué un `null` Nullable<T> tiene un código hash?



que es null en programacion (3)

Una pregunta rara ...

¿Pero alguien puede darme una justificación de por qué se esperaría este comportamiento?

Esto me parece totalmente extraño ...

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

NullReferenceException: referencia de objeto no establecida en una instancia de un objeto.

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

0

Esto obviamente significa:

int? zero = 0; int? argh = null; zero.GetHashCode() == argh.GetHashCode(); //true


El punto aquí es que

int? i = null;

no crea una variable i que es null , pero (al realizar un lanzamiento implícito) una Nullable<int> que no tiene un valor.
Esto significa que el objeto / instancia no es null (y como Nullable<T> es un tipo de estructura / valor, en realidad no puede ser null ) y, por lo tanto, tiene que devolver un código hash.

Esto también está documentado here :

El código hash del objeto devuelto por la propiedad Value si la propiedad HasValue es verdadera o cero si la propiedad HasValue es falsa.


Parece un comportamiento documentado de Nullable<T>.GetHashCode() , como dice la documentación :

El código hash del objeto devuelto por la propiedad Value si la propiedad HasValue es verdadera o cero si la propiedad HasValue es falsa.


int? en realidad es solo una abreviatura de Nullable<int> , una estructura que envuelve el tipo int para permitir que sea nulo. Nullable se puede usar con cualquier tipo de valor.

Como Nullable es en realidad una estructura (no puede ser nulo), tiene que devolver algo para un código hash, y normalmente devolvería el código hash del valor (presumiblemente para ser lo más transparente posible al valor dentro). Cuando el valor es nulo, está codificado para devolver 0 de manera predeterminada:

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

Mira here .