Mam dwie kolekcje własnych obiektów typu referencyjnego, dla których napisałem własną metodę IEquatable.Equals i chcę mieć możliwość korzystania z metod LINQ na nich.Dlaczego nie jest .Except (LINQ) prawidłowo porównując rzeczy? (używając IEquatable)
Więc
List<CandyType> candy = dataSource.GetListOfCandy();
List<CandyType> lollyPops = dataSource.GetListOfLollyPops();
var candyOtherThanLollyPops = candy.Except(lollyPops);
Według dokumentacji .Except, nie przechodząc IEqualityComparer powinno skutkować EqualityComparer.Default używany do porównania obiektów. Dokumentacja dla domyślnego porównywalnika jest następująca:
"Właściwość Default sprawdza, czy typ T implementuje ogólny interfejs System.IEquatable, a jeśli tak, zwraca EqualityComparer, który używa tej implementacji. W przeciwnym razie zwraca EqualityComparer, który używa przesłonięć Object.Equals i Object.GetHashCode dostarczone przez T. "
Tak więc, ponieważ implementuję IEquatable dla mojego obiektu, powinien on używać tego i pracować. Ale tak nie jest. To nie działa, dopóki nie nadpisuję GetHashCode. W rzeczywistości, jeśli ustawię punkt przerwania, moja metoda IEquatable.Equals nigdy nie zostanie wykonana. To sprawia, że myślę, że dzieje się z planem B zgodnie z jego dokumentacją. Rozumiem, że nadpisywanie kodu GetHashCode i tak jest dobrym pomysłem, i mogę to zrobić działa, ale jestem zdenerwowany, że zachowuje się w sposób niezgodny z własną dokumentacją.
Dlaczego nie robi to, co powiedział? Dziękuję Ci.
Spróbuj użyć EqualityComparer.Default bezpośrednio i sprawdzić, czy niezgodność jest w tej realizacji, lub metodą LINQ na początek. Następnie otwórz Reflector i sprawdź źródło i dodaj komentarz do dokumentów MSDN? – MichaelGG
Jako węzeł boczny, rzeczy, które nie zachowują się jak udokumentowane, są uważane za błędy, więc zachęcam do przesłania ich jako Microsoft Connect. Do tej pory miałem mniejsze błędy w dokumentacji zgłoszone za pośrednictwem tego kanału naprawione w przeszłości. –