我有这样的界面:
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
}
目前IFoo
为IEquatable<IFoo>
,因此FooBar1和FooBar2会覆盖Equals(IFoo other)
,但这不是在==上调用的内容。我正在搜索我的代码,用a==b
替换a.Equals(b)
,但这并不好。
我该怎么办?
答案 0 :(得分:22)
==
需要您使用的某种类型中的静态方法,并且接口不能包含这些方法。扩展方法也无济于事。所以在接口==总是使用引用相等。
请注意,如果== null,则a.Equals(b)
将抛出异常。
答案 1 :(得分:6)
不,你既不能在接口上重载操作符,也不能确保任何实现者都这样做(因为操作符重载在C#中是静态的) )。
您最好的选择是让IFoo
继承IEquatable<IFoo>
并使用Equals(IFoo)
答案 2 :(得分:3)
答案 3 :(得分:0)
您在这里讨论的是实现细节,接口不应该(不能)定义它的实现方式。
答案 4 :(得分:0)
自从引入 C# 8 以来,您可以提供具有默认实现和静态方法的接口(允许您为接口定义运算符)
更多信息: https://docs.microsoft.com/dotnet/csharp/tutorials/default-interface-methods-versions