【发布时间】:2017-06-01 04:41:48
【问题描述】:
我有一个通过引用进行比较的基类和一个通过值进行比较的派生类(仅显示此处相关的行):
class Term : IReadOnlyList<Term>
public static bool operator ==(Term a, Term b)
{
if (ReferenceEquals(a, null))
return false;
return a.Equals(b);
}
sealed class CompoundTerm : Term, IReadOnlyList<Term>
public override bool Equals(object o)
所以派生类会覆盖Equals,但基类必须重载==,因为a == b 可能而且确实很可能会在a 和b 声明为@ 的上下文中发生987654327@但实际上指向CompoundTerm。
据我所知 - 如果我错了,请纠正我 - 这是所有必要且正确的。
不幸的是,编译器对此并不满意:
Term.cs(40,11): warning CS0660: 'Term' defines operator == or operator != but does not override Object.Equals(object o)
在这里做什么最好?我可以使用禁用警告的蛮力解决方案,但我想检查并确保没有更优雅的解决方案,我缺少一些成语。
【问题讨论】:
-
“我有一个通过引用进行比较的基类” - 这不是您的基类所做的。它调用
Equals,可以在派生类中重写。听起来您应该可能将Equals重写为基类中的 abstract 方法,以强制所有子类提供实现。 (同上 GetHashCode。)(假设您也可以使您的Term类抽象,这似乎很可能。) -
@JonSkeet 当然,我可以将
Term抽象化,并将AtomicTerm派生类作为通过引用进行比较的类。在这种情况下,AtomicTerm.Equals是必需的,但可以是只返回ReferenceEquals(this, o)? -
@JonSkeet 但是,在这种情况下,我该怎么办
AtomicTerm.GetHashCode?是否有类似方便的方法来调用通过引用工作的默认版本? -
您可以使用
System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(object),但是对于那种 一个 类型的术语具有引用相等性,但所有其他术语具有值相等性,这很奇怪... 另请注意您的接线员可以简化为调用Equals(a, b)。处理无效性。
标签: c# .net operator-overloading equality