Потому что каждый объект в C# можно поместить в виде ключа хэш таблицу, которая устроена так(объясняется устройство Dictionary<Key,Value>) Вычисляется хэш код объекта-ключа посредством вызова метода GetHashCode, далее по остатку от деления на количество корзин в словаре, объект помещается в корзину, в процессе возникают коллизии, т.е в одной корзине может лежать несколько объектов и тогда для поиска выбранного объекта при вызове dic[Key]:
- будет вызван GetHashCode объекта Key
- полученный хэш код будет взят по модулю количества корзин
- Будет выполнен проход по корзине и поиск нужного ключа, и если Equals не переопределен и указывает на адрес в памяти(ссылка), то при структурном определении GetHashCode, объект вообще не найдется, так как у двух экземпляров классов с одинаковыми поляеми разные ссылки, GetHashCode вернут одинаковые значения, но вызовы Equals - вернут false
Потому что реализация хэш функции для базовых типов языка (string,long,decimal) может измениться и в итоге все сохраненные хэш-коды станут невалидными
Если это сделать то получится, что объект лежит уже не в той корзине, потому что если бы ключ был изменен до добавления, то хэш код был бы уже другой. При dic[Key](где Key - изменненный ключ) будет выполнен поиск по другой корзине, в итоге объект не будет найден и выброшено исключение
- Детерминирован
- При вызове на все возможных объектах значение хэш кодов распределяется равномерно
- Выполняется быстро
- В формировании ответа участвуют только readonly поля, так как иначе может произойти описанное в пункте 3, если кто-то изменит поле учатсвующее в вычислении функции GetHashCode окажется, значение хэш-кода при поиске по ключу изменится