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

TDa*_*ver 18 .net c# equality interface iequatable

我有这样的界面:

public interface IFoo
{
  int A {get;}
  int B {get;}
}
Run Code Online (Sandbox Code Playgroud)

我有多个实现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
}
Run Code Online (Sandbox Code Playgroud)

目前IFooIEquatable<IFoo>,所以FooBar1和FooBar2重写Equals(IFoo other),但这不是在==上调用的内容.我正在搜索我的代码以替换a==ba.Equals(b)任何地方,但这并不好.

我能做什么?

Cod*_*aos 23

不,你不能.重载==需要使用其中一种类型的静态方法,并且接口不能包含这些方法.扩展方法也无济于事.所以在接口==总是使用引用相等.

请注意,a.Equals(b)如果== null ,则会抛出异常.

  • @TDaver或你可以使用`Object.Equals(a,b)`,由于每个类型都继承了Object,因此可以简化为`Equals(a,b)` (2认同)

Jam*_*iec 6

不,您既不能在接口上重载操作符,也不能确保任何实现者都这样做(因为操作符重载在C#中是静态的).

你最好的选择就是你所做的,IFoo继承IEquatable<IFoo>和使用Equals(IFoo)