¿Por qué se implementa ValueType.GetHashCode () como está?

DeValueType.cs

**Action: Our algorithm for returning the hashcode is a little bit complex. We look 
**        for the first non-static field and get it's hashcode.  If the type has no 
**        non-static fields, we return the hashcode of the type. We can't take the
**        hashcode of a static member because if that member is of the same type as 
**        the original type, we'll end up in an infinite loop.

Me mordió esto hoy cuando estaba usando un KeyValuePair como clave en un Diccionario (almacenó el nombre del atributo xml (enum) y su valor (cadena)), y esperaba que tuviera su código hash calculado en función de todos sus campos, pero de acuerdo con la implementación, solo consideró la parte clave.

Ejemplo (c / p de Linqpad):

void Main()
{
    var kvp1 = new KeyValuePair<string, string>("foo", "bar");
    var kvp2 = new KeyValuePair<string, string>("foo", "baz");

    // true
    (kvp1.GetHashCode() == kvp2.GetHashCode()).Dump();
}

El primer campo no estático, supongo, significa el primer campo en orden de declaración, lo que también podría causar problemas al cambiar el orden variable en la fuente por cualquier razón, y creer que no cambia el código semánticamente.

Respuestas a la pregunta(0)

Su respuesta a la pregunta