Aby dodać powyższe odpowiedzi:
Jeśli nie zastąpisz opcji Równa się, domyślnym zachowaniem jest porównywanie odniesień do obiektów. To samo dotyczy hashcode - domyślna implementacja zwykle opiera się na adresie pamięci odniesienia. Ponieważ zastąpiłeś Equals, oznacza to, że poprawnym zachowaniem jest porównanie wszystkiego, co zaimplementowałeś w Equals, a nie referencji, więc powinieneś zrobić to samo dla kodu skrótu.
Klienci twojej klasy oczekują, że kod skrótu będzie miał logikę podobną do metody równości, na przykład metody linq, które używają IEqualityComparer najpierw porównają kody skrótu i tylko jeśli są równe, porównają metodę Equals (), która może być droższa aby uruchomić, jeśli nie zaimplementujemy hashcode, równy obiekt prawdopodobnie będzie miał różne hashcode (ponieważ mają inny adres pamięci) i zostanie błędnie określony jako nierówny (Equals () nawet nie trafi).
Ponadto, z wyjątkiem problemu polegającego na tym, że możesz nie być w stanie znaleźć swojego obiektu, jeśli używałeś go w słowniku (ponieważ został on wstawiony przez jeden kod skrótu, a gdy go szukasz, domyślny kod skrótu prawdopodobnie będzie inny i znowu będzie równy () nawet nie zostanie wywołany, jak wyjaśnia Marc Gravell w swojej odpowiedzi, wprowadzasz również naruszenie słownika lub koncepcji skrótu, które nie powinny dopuszczać identycznych kluczy - już zadeklarowałeś, że te obiekty są zasadniczo takie same, gdy przesłonisz Equals, więc nie nie chcę obu z nich jako różnych kluczy w strukturze danych, które mają mieć unikalny klucz, ale ponieważ mają one inny kod skrótu, „ten sam” klucz zostanie wstawiony jako inny.