首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解IEquatable

了解IEquatable
EN

Stack Overflow用户
提问于 2009-01-04 19:08:06
回答 2查看 21.2K关注 0票数 52

当我实现要使用IEquatable interface进行比较的对象时

如果我已经实现了Equals(T)

  • Can,那么在实现IEquatable<T>

之后,我使用==!=运算符,为什么必须重写Equals(object)方法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-01-04 19:11:37

来自MS Docs article on IEquatable

如果实现IEquatable<T>,还应该覆盖Equals(Object)GetHashCode()的基类实现,以便它们的行为与Equals(T)方法的行为一致。如果确实重写了Equals(Object),则还会在调用类上的静态Equals(Object, Object)方法时调用重写的实现。此外,您应该重载op_Equalityop_Inequality运算符。这可确保所有相等性测试返回一致的结果。

  1. No,operators do not use the Equals method。他们必须是overloaded separately才能这样做。
票数 52
EN

Stack Overflow用户

发布于 2009-01-04 19:28:45

1)正如雷所说,当从不知道(静态地)实现IEquatable<T>的类调用方法时,覆盖Equals(object)以确保一致性。例如,非泛型集合类将使用Equals(object)进行比较。您还应该覆盖GetHashCode()

2)实现IEquatable<T>不会自动重载==和!=运算符,但没有什么可以阻止您这样做,就像System.String一样。然而,如果你这样做了,你应该非常清楚地记录这一点-当你在其他类型的引用(例如MyType和Object)之间进行比较时要小心,这些引用仍然会使用身份比较。我怀疑这样做不是一个好主意,除非它在你的代码中是一个非常常用的类型,每个人都会对它非常熟悉,而且重载==的语法糖确实会对可读性产生积极的影响。

票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/411500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档