Подтвердить что ты не робот

Могу ли я перегрузить оператор == на интерфейсе?

У меня есть такой интерфейс:

public interface IFoo
{
  int A {get;}
  int B {get;}
}

и у меня есть несколько классов, реализующих IFoo.
Я хочу проверить равенство, а не на основе ReferenceEquality, но два IFoos следует считать равными, если оба A и B одинаковы (на самом деле я проверяю набор пар Key-Value, отправленных через WCF, поэтому я могу у вас нет ReferenceEquality).
Теперь, если у меня есть:

IFoo first = new FooBar1() { A = 1, B = 1};
IFoo second = new FooBar2() { A = 1, B = 1};
if (first == second) {
 //this should return true
}

В настоящее время IFoo есть IEquatable<IFoo>, поэтому FooBar1 и FooBar2 переопределяют Equals(IFoo other), но это не то, что вызывается в ==. Я просматриваю свой код, чтобы заменить a==b на a.Equals(b) всюду, но это просто не приятно.

Что я могу сделать?

4b9b3361

Ответ 1

Нет, вы не можете. Для перегрузки == требуются статические методы в одном из типов, которые вы используете, и интерфейс не может содержать их. Методы расширения не могут помочь. Таким образом, интерфейсы == всегда используют ссылочное равенство.

Обратите внимание, что a.Equals(b) выдаст исключение, если == null.

Ответ 2

Нет, вы не можете ни перегружать оператора на интерфейсе, ни гарантировать, что это делают какие-либо разработчики (поскольку перегрузка оператора статична в С# ).

Ваш лучший вариант - это то, что вы сделали, чтобы сделать IFoo наследовать от IEquatable<IFoo> и использовать Equals(IFoo)

Ответ 4

То, о чем вы говорите, - это деталь реализации, интерфейс не должен (не может) определить, как он реализован.