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 并不能确保它们是相同的,而且它会给你带来问题也就不足为奇了。
我有一个实现 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 并不能确保它们是相同的,而且它会给你带来问题也就不足为奇了。