我可以在接口上重载==运算符吗?
我有这样的界面:
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
,因此FooBar1和FooBar2重写Equals(IFoo other)
,但这不是在==上调用的内容。 我正在搜索我的代码,用a.Equals(b)
替换a==b
,但这并不好。
我能做什么?
不,你不能。 重载==
需要您使用的某种类型中的静态方法,并且接口不能包含这些方法。 扩展方法也无济于事。 所以在接口==总是使用引用相等。
请注意,如果a == null,则a.Equals(b)
将抛出exception。
不,您既不能在接口上重载操作符,也不能确保任何实现者都这样做(因为操作符重载在C#中是静态的)。
你做的最好的选择是让IFoo
inheritanceIEquatable
并使用Equals(IFoo)
除了CodeInChaos的回答,您可能有兴趣阅读Overriding Equals()和Operator ==的指南 。
你在这里谈论的是一个实现细节,接口不应该(不能)定义它的实现方式。