关于c#:我可以在接口上重载==运算符吗?

Can I overload an == operator on an Interface?

我有这样的界面:

1
2
3
4
5
public interface IFoo
{
  int A {get;}
  int B {get;}
}

我有多个实现ifoo的类。我想检查相等性,而不是基于引用相等性,但如果a和b都相同,则两个ifoos应被视为相等(实际上,我正在检查通过wcf发送的一组键值对,这就是我不能具有引用相等性的原因)。如果我有:

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

目前IFooIEquatable,所以foobar1和foobar2会覆盖Equals(IFoo other),但这不是我们所说的==。我正在搜索代码,以在任何地方用a.Equals(b)替换a==b,但这并不好。

我能做什么?


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

注意,如果a==null,a.Equals(b)将抛出异常。


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

你最好的选择是你所做的,让IFooIEquatable继承并使用Equals(IFoo)


除了codeinchaos的答案之外,您可能还有兴趣阅读重写equals()和operator==的指南。


您在这里谈论的是一个实现细节,一个接口不应该(不能)定义它是如何实现的。