Понимание IEquatable

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

  • Почему мне приходится переопределять Equals (object), если мне нужно реализовать Equals < >
  • Могу ли я использовать == и!= один раз реализовать IEquatable?

Ответ 1

Относительно # 1:

От MSDN:

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

2) Нет, они делают простые сравнения ссылок и не используют метод Equals.

Ответ 2

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

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