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

From 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 (перечисление) и его значение (строка)), и ожидается, что его хэш-код будет вычислен на основе всех его полей, но в соответствии с реализацией он учитывает только часть ключа.

Пример (c / p из 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();
}

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

23
задан alh84001 1 October 2010 в 17:28
поделиться