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