У меня есть две коллекции собственных объектов ссылочного типа, которые я написал для себя свой метод IEquatable.Equals, и я хочу иметь возможность использовать методы LINQ для них.
Итак,
List<CandyType> candy = dataSource.GetListOfCandy();
List<CandyType> lollyPops = dataSource.GetListOfLollyPops();
var candyOtherThanLollyPops = candy.Except( lollyPops );
В соответствии с документацией. Кроме того, если не передавать IEqualityComparer, это должно привести к тому, что EqualityComparer.Default используется для сравнения объектов. И документация для сравнения по умолчанию:
"Свойство Default проверяет, реализует ли тип T общий универсальный интерфейс System.IEquatable, и если это так возвращает EqualityComparer, который использует эту реализацию. В противном случае он возвращает EqualityComparer, который использует переопределения Object.Equals и Object.GetHashCode, предоставленные T."
Итак, поскольку я реализую IEquatable для своего объекта, он должен использовать это и работать. Но это не так. Он не работает, пока я не переопределяю GetHashCode. Фактически, если я устанавливаю точку прерывания, мой метод IEquatable.Equals никогда не будет выполнен. Это заставляет меня думать, что он идет с планом Б в соответствии с его документацией. Я понимаю, что переопределение GetHashCode - это хорошая идея, так или иначе, и я могу заставить это работать, но я расстроен тем, что он ведет себя так, что не соответствует тому, что заявлено в его собственной документации.
Почему он не делает то, что он сказал? Спасибо.