FirstOrDefault 如何检验相等性?

How Does FirstOrDefault Test for Equality?

我有一个实现 IEquatable 接口的引用类型。我有一个包含单个对象的哈希集。然后我创建一个对象,根据 IEquatable 的标准,该对象与示例相同。但是,当我 运行

var equivalentEntry = _riskControlATMEntries[grouping.Key].FirstOrDefault(e => e == atmEntry);

在对象上我得到 null。

另一方面,当我这样做时

var equivalentEntry = _riskControlATMEntries[grouping.Key].FirstOrDefault(e => e.Equals(atmEntry));

我根据 IEquatable 接口的实现得到了被认为相等的对象。

那么,为什么 HashSet 依赖 public bool Equals(ReferenceType other)FirstOrDefault 不依赖? FirstOrDefault(e => e == other) 中的 == 运算符在寻找什么相等性?

FirstOrDefault 根本不比较项目的相等性。您提供了一个过滤委托,在一种情况下使用 == 运算符比较两个对象,在另一种情况下使用 Equals 方法。

== 运算符执行 class 定义的任何类型的操作,或者如果未定义,则执行最接近的基类型(object 是基类型总是存在的类型,如果没有更好的定义,它将始终有一个定义;它将根据对象的引用来比较对象)。好的设计表明,您应该确保 class 的 == 运算符被定义为与 Equals 方法的行为完全相同,但语言中没有任何内容强制您这样做,并且显然这 class 并不能确保它们是相同的,而且它会给你带来问题也就不足为奇了。