繁体   English   中英

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

[英]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
}

目前IFooIEquatable<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM