Могу ли я перегрузить оператор == на интерфейсе? - PullRequest
17 голосов
/ 21 февраля 2011

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

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

и у меня есть несколько классов, реализующих IFoo.
Я хочу проверить равенство, не основываясь на ReferenceEquality, но два IFoos следует считать равными, если и A, и B совпадают (на самом деле я проверяю набор пар ключ-значение, отправленных через 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), но это просто нехорошо.

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

Ответы [ 4 ]

22 голосов
/ 21 февраля 2011

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

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

6 голосов
/ 21 февраля 2011

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

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

3 голосов
/ 21 февраля 2011

Помимо CodeInChaos 'ответа вас может заинтересовать чтение Руководства по переопределению Equals () и оператора == .

0 голосов
/ 21 февраля 2011

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

...