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

时间:2011-02-21 13:02:42

标签: c# .net interface equality iequatable

我有这样的界面:

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
}

目前IFooIEquatable<IFoo>,因此FooBar1和FooBar2会覆盖Equals(IFoo other),但这不是在==上调用的内容。我正在搜索我的代码,用a==b替换a.Equals(b),但这并不好。

我该怎么办?

5 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:6)

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

您最好的选择是让IFoo继承IEquatable<IFoo>并使用Equals(IFoo)

答案 2 :(得分:3)

除了CodeInChaos'回答,您可能有兴趣阅读Guidelines for Overriding Equals() and Operator ==

答案 3 :(得分:0)

您在这里讨论的是实现细节,接口不应该(不能)定义它的实现方式。

答案 4 :(得分:0)

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

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