Почему ValueType.GetHashCode () реализован как есть?

ОтValueType.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.

Сегодня меня это укусило, когда я использовал KeyValuePair в качестве ключа в словаре (в нем хранилось имя атрибута xml (enum) и его значение (строка)), и ожидал, что его хэш-код будет вычислен на основе всех его полей, но согласно реализации он рассматривал только ключевую часть.

Пример (к / п от 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();
}

Первое нестатическое поле, которое я предполагаю, означает первое поле в объявленном порядке, что также может вызвать проблемы при изменении порядка переменных в источнике по любой причине, и полагая, что это не меняет код семантически.

Ответы на вопрос(0)

Ваш ответ на вопрос