TL;DR
Kasa biletowa w kinie sprzedaje to samo miejsce dwa razy, choć kod sprawdza dostępność. Winowajca jest banalny: klasa Seat nie nadpisuje Equals, więc domyślne porównanie sprawdza tożsamość obiektu w pamięci, a nie rząd i numer miejsca. Dwa obiekty new Seat(7, 12) są dla programu zupełnie różnymi miejscami, więc List.Contains nigdy nie wykrywa kolizji.
Pułapka robi się głębsza przy HashSet i Dictionary, bo one najpierw pytają o GetHashCode i bez spójnej implementacji Equals może w ogóle nie dostać głosu. Tekst pokazuje, jak obie metody napisać razem, jaką rolę ma ostrzeżenie kompilatora CS0659 i dlaczego sam operator == dalej potrafi zaskoczyć. To lektura na jedno posiedzenie, po której zaczniesz inaczej patrzeć na własne klasy modelowe.
Ania kupuje bilet do kina: rząd 7, miejsce 12. Minutę później Bartek kupuje bilet na dokładnie to samo miejsce — i program kasy mu go sprzedaje. A przecież program sprawdza, czy mi...
Czytaj cały wpis u źródła