Когда вы выполняете поиск по словарю, происходит следующее:
- Словарь использует TKey.GetHashCode для вычисления хэша для корзины.
- Затем он проверяет все хэши, используя это поле, и вызывает Equals для отдельных объектов, чтобы определить совпадение.
Если сегменты никогда не совпадают (поскольку GetHashCode не был перезаписан), вы никогда не вызовете Equals. Это часть того, почему вы должны всегда реализовывать оба, если вы реализуете оба - и вы должны переопределить обе функции (более осмысленно, чем просто вызов base.GetHashCode ()), если вы хотите использовать свой объект в хешированной коллекции.
Если вы реализуете класс, вы должны реализовать процедуру GetHashCode, которая возвращает тот же хеш-код для элементов, которые равны. В идеале вы хотите возвращать другой хэш-код для элементов, которые не всегда равны, поскольку это значительно ускорит поиск в словаре.
Вы должны также реализовать Equals таким образом, чтобы правильно проверять наличие одинаковых экземпляров.
Реализация по умолчанию для классов (ссылочных типов) просто сравнивает саму ссылку. Два экземпляра с абсолютно одинаковыми значениями по умолчанию возвращают false на Equals (поскольку они имеют разные ссылки). По умолчанию несколько экземпляров всегда будут возвращать другой хэш-код.