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