Просто додати відповіді вище:
Якщо ви не переосмислюєте рівність, то типовою поведінкою є порівняння посилань на об'єкти. Це ж стосується і хеш-коду - імплікація за замовчуванням, як правило, базується на адресі пам'яті посилання. Оскільки ви переопрацювали рівний, це означає, що правильна поведінка полягає в порівнянні того, що ви реалізували на рівних, а не посиланнях, тому ви повинні зробити те ж саме для хеш-коду.
Клієнти вашого класу очікують, що хеш-код має подібну логіку до методу рівних, наприклад методики linq, які використовують IEqualityComparer, спочатку порівнюють хеш-коди, і лише якщо вони рівні, вони порівняють метод Equals (), який може бути дорожчим запустити, якщо ми не реалізували хеш-код, рівний об’єкт, ймовірно, матиме різні хеш-коди (оскільки вони мають різну адресу пам'яті) і буде визначений помилково, як не рівний (Equals () навіть не потрапить).
Крім того, за винятком проблеми, що ви не зможете знайти свій об'єкт, якби ви використовували його у словнику (тому що він був вставлений одним хеш-кодом, і коли ви шукаєте його, хеш-код за замовчуванням, ймовірно, буде іншим, і знову дорівнює () навіть не зателефонуйте, як пояснює Марк Гравелл у своїй відповіді, ви також вводите порушення словника або поняття хештету, яке не повинно допускати однакових ключів - ви вже заявили, що ці об'єкти є по суті однаковими, коли ви переобираєте рівність, так що ви не Я не хочу, щоб обидва вони були різними ключами структури даних, які, мабуть, мають унікальний ключ, але оскільки у них інший хеш-код, "той самий" ключ буде вставлений як інший.