Что такое сопоставитель равенства по умолчанию для заданного типа?

В API-интерфейсе MSDN для конструктора HashSet без аргументов он указывает

Инициализирует новый экземпляр класса HashSet, который пуст и использует сопоставитель равенства по умолчанию для заданного типа.

Что такое сопоставитель равенства по умолчанию для заданного типа, например. для пользовательского класса?

BTW: Является ли это просто мной или является документацией MSDN API, немного тонкой в ​​объяснениях? Я несколько раз спотыкаюсь о таких вопросах, читая его.

Ответ 1

Это означает, что он будет использовать компаратор, возвращенный EqualityComparer<T>.Default для типа элемента T для набора.

Как указано в документации:

Свойство Default проверяет, реализует ли тип T System.IEquatable и, если это так, возвращает EqualityComparer, который использует эту реализацию. В противном случае возвращает EqualityComparer, который использует переопределения Object.Equals и Object.GetHashCode, предоставленные T.

Итак, для вашего пользовательского типа он будет использовать метод GetHashCode, который вы определили, чтобы найти элементы в наборе. Если вы внедрили IEquatable<T>, он будет использовать IEquatable<T>.Equals(T) для равенства, иначе он будет использовать ваш метод Equals(object). Этот метод по умолчанию использует ссылочное равенство, как определено в классе object. Поэтому, если вы определяете равенство с помощью любого из методов, вы также должны будете также переопределить GetHashCode.

Ответ 2

По умолчанию он будет делегировать EqualityComparer<T>.Default. Это возвращает сравнитель, который может сравнивать два объекта типа T.

Для пользовательского класса это делает несколько вещей в следующем порядке:

  • если класс реализует IEquatable<T>, он делегирует реализацию класса этого интерфейса
  • Если класс имеет метод Equals, он будет использовать этот
  • в качестве крайней меры, он будет использовать ссылочное равенство