19

我有一个这样的界面:

public interface IFoo
{
  int A {get;}
  int B {get;}
}

我有多个实现 IFoo 的类。
我想检查相等性,而不是基于 ReferenceEquality,但是如果 A 和 B 相同,则两个 IFoo 应该被认为是相等的(实际上我正在检查通过 WCF 发送的键值对的集合,这就是为什么我可以'没有 ReferenceEquality)。
现在,如果我有:

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

目前IFooIEquatable<IFoo>,所以 FooBar1 和 FooBar2 覆盖Equals(IFoo other),但这不是在 == 上调用的。我正在寻找我的代码以替换a==b任何a.Equals(b)地方,但这并不好。

我能做些什么?

4

5 回答 5

25

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

请注意,a.Equals(b)如果 a==null 将引发异常。

于 2011-02-21T13:05:06.907 回答
6

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

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

于 2011-02-21T13:06:46.267 回答
3

除了CodeInChaos的回答,您可能有兴趣阅读Overriding Equals() 和 Operator ==的指南。

于 2011-02-21T13:09:31.637 回答
0

自引入 C# 8 以来,您可以为接口提供默认实现和静态方法(允许您为接口定义运算符)

更多信息: https ://docs.microsoft.com/dotnet/csharp/tutorials/default-interface-methods-versions

于 2021-02-01T09:43:58.890 回答
-1

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

于 2011-02-21T13:21:40.233 回答