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
} |
号
目前IFoo是IEquatable,所以foobar1和foobar2会覆盖Equals(IFoo other),但这不是我们所说的==。我正在搜索代码,以在任何地方用a.Equals(b)替换a==b,但这并不好。
我能做什么?
不能。重载==需要使用其中一种类型的静态方法,接口不能包含这些方法。扩展方法也无济于事。所以在接口上,==总是使用引用相等。
注意,如果a==null,a.Equals(b)将抛出异常。
- 是的,为此,我已经编写了EqualsWithNull扩展,它为a.EqualsWithNull(b)返回true…
- @tdaver或者您可以使用Object.Equals(a, b),因为每个类型都继承对象,所以可以缩短为Equals(a, b)。
不,既不能在接口上重载操作符,也不能确保任何实现者都这样做(因为操作符重载在C中是静态的)#)
你最好的选择是你所做的,让IFoo从IEquatable继承并使用Equals(IFoo)。
除了codeinchaos的答案之外,您可能还有兴趣阅读重写equals()和operator==的指南。
- 但请注意,它表示在类型不可变时重载operator ==和operator !=。因此,have接口(多个类型相同的接口,但语义不同,都是不可变的)需要使用抽象基而不是接口,这样当其他类型返回混合集合时,我可以重写操作符。最后:达到clr类型系统的限制(再次:-()。
您在这里谈论的是一个实现细节,一个接口不应该(不能)定义它是如何实现的。
- 请解释投反对票的原因?
- 你没有错,但你的回答更接近于评论。这不是"为什么"的问题。(只是猜测一下,我没有投票。)