当我实现要使用IEquatable<T>
接口比较的对象时:
- 如果我已经实现了,为什么我必须重写
Equals(object)
方法Equals(T)
? - 实施后可以使用
==
and!=
运算符IEquatable<T>
吗?
当我实现要使用IEquatable<T>
接口比较的对象时:
Equals(object)
方法Equals(T)
?==
and!=
运算符IEquatable<T>
吗?如果您实现
IEquatable<T>
,您还应该覆盖 和 的基类实现,Equals(Object)
以便GetHashCode()
它们的行为与Equals(T)
方法的行为一致。如果你做 overrideEquals(Object)
,你的覆盖实现也会在调用Equals(Object, Object)
你的类的静态方法时被调用。此外,您应该重载op_Equality
andop_Inequality
运算符。这可确保所有相等性测试返回一致的结果。
不,运算符不使用 Equals 方法。它们必须单独重载才能这样做。
1)正如雷所说,Equals(object)
当从不知道(静态)你实现的类调用方法时,覆盖以确保一致性IEquatable<T>
。例如,非泛型集合类将Equals(object)
用于比较。您还应该覆盖GetHashCode()
.
2) 实现IEquatable<T>
不会自动重载 == 和 != 运算符,但没有什么可以阻止您这样做,就像这样做一样System.String
。但是,如果您这样做,您应该非常清楚地记录这一点 - 并且在您对仍然使用身份比较的其他类型的引用(例如 MyType 和 Object)进行比较时要小心。我怀疑这样做不是一个好主意,除非它在你的代码中是一个非常常用的类型,每个人都会非常熟悉它,并且重载 == 的语法糖会对可读性产生积极影响。