我可以在接口上重载==运算符吗?

我有这样的界面:
public interface IFoo
{
  int A {get;}
  int B {get;}
}
我有多个实现IFoo的类。 我想检查相等性,而不是基于ReferenceEquality,但是如果A和B都相同,那么两个IFoos应该被认为是相同的(实际上我正在检查通过WCF发送的Key-Value对的集合,这就是为什么我可以没有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.Equals(b)
替换
a==b
,但这并不好。 我能做什么?     
已邀请:
不,你不能。重载
==
需要使用其中一种类型的静态方法,并且接口不能包含这些方法。扩展方法也无济于事。所以在接口==总是使用引用相等。 请注意,如果a == null,
a.Equals(b)
将抛出异常。     
不,你既不能在接口上重载操作符,也不能确保任何实现者都这样做(因为操作符重载在C#中是静态的) )。 你做的最好的选择是让
IFoo
继承自
IEquatable<IFoo>
并使用
Equals(IFoo)
    
除了CodeInChaos的回答,您可能有兴趣阅读Overriding Equals()和Operator ==的指南。     
你在这里谈论的是一个实现细节,一个接口不应该(不能)定义它是如何实现的。     

要回复问题请先登录注册