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