Понимание IEquatable

Когда я реализую объекты, которые я хочу сравнить, используя IEquatable<T> интерфейс:

  1. Почему я должен переопределить Equals(object) метод, если я уже реализовал Equals(T)?
  2. Могу ли я использовать == а также != операторы, когда я реализую IEquatable<T>?

2 ответа

Решение
  1. Из статьи MS DocsIEquatable<T>:

    Если вы реализуете IEquatable<T>Вы также должны переопределить реализации базового класса Equals(Object) а также GetHashCode() так что их поведение соответствует поведению Equals(T) метод. Если вы переопределите Equals(Object)ваша переопределенная реализация также вызывается в вызовах статических Equals(Object, Object) метод в вашем классе. Кроме того, вы должны перегрузить op_Equality а также op_Inequality операторы. Это гарантирует, что все тесты на равенство возвращают согласованные результаты.

  2. Нет, операторы не используют метод Equals. Для этого они должны быть перегружены отдельно.

1) Как сказал Рэй, переопределить Equals(object) чтобы обеспечить согласованность при вызове метода из классов, которые не знают (статически), что вы реализуете IEquatable<T>, Например, классы неуниверсальных коллекций будут использовать Equals(object) для сравнения. Вы также должны переопределить GetHashCode(),

2) Реализация IEquatable<T> не перегружает операторы == и!= автоматически, но ничто не мешает вам сделать это, как System.String делает. Однако, если вы это сделаете, вы должны очень четко задокументировать это и быть осторожным при сравнении других типов ссылок (например, MyType и Object), которые все равно будут использовать сравнение идентификаторов. Я подозреваю, что это не очень хорошая идея делать это, если только это не будет очень интенсивно используемый тип в вашем коде, где все будут очень хорошо с ним знакомы и где синтаксический сахар перегрузки == действительно окажет положительное влияние на удобочитаемость.

Другие вопросы по тегам