[英]Can I overload an == operator on an Interface?
我有一个这样的界面:
public interface IFoo
{
int A {get;}
int B {get;}
}
我有多个实现 IFoo 的类。
我想检查相等性,而不是基于 ReferenceEquality,但是如果 A 和 B 相同,则两个 IFoos 应该被视为相等(实际上我正在检查通过 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
}
目前IFoo
是IEquatable<IFoo>
,所以 FooBar1 和 FooBar2 覆盖Equals(IFoo other)
,但这不是 == 调用的内容。 我正在寻找我的代码以在任何地方用a.Equals(b)
替换a==b
,但这并不好。
我能做什么?
不,你不能。 重载==
需要您使用的其中一种类型的静态方法,而接口不能包含这些方法。 扩展方法也无济于事。 所以在接口 == 总是使用引用相等。
请注意,如果 a==null, a.Equals(b)
将抛出异常。
不,您既不能在接口上重载运算符,也不能确保任何实现者都这样做(因为运算符重载在 C# 中是静态的)。
你最好的选择是你所做的,让IFoo
继承自IEquatable<IFoo>
并使用Equals(IFoo)
除了CodeInChaos的回答,您可能有兴趣阅读重写 Equals() 和 Operator == 的指南。
自引入 C# 8 以来,您可以提供具有默认实现和静态方法的接口(允许您为接口定义运算符)
更多信息: https : //docs.microsoft.com/dotnet/csharp/tutorials/default-interface-methods-versions
你在这里谈论的是一个实现细节,一个接口不应该(不能)定义它是如何实现的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.