如果我冒昧地猜测一下,这可能是为了支持将double
值用作字典中的键。
如果x.Equals(y)
返回and false
,那么你可以有这样的代码:x = double.NaN
y = double.NaN
var dict = new Dictionary<double, string>();
double x = double.NaN;
dict.Add(x, "These");
dict.Add(x, "have");
dict.Add(x, "duplicate");
dict.Add(x, "keys!");
我认为大多数开发人员会发现这种行为相当不直观。但更违反直觉的是:
// This would output false!
Console.WriteLine(dict.ContainsKey(x));
基本上,通过一个永远不会返回某个值的实现Equals
,您将拥有一种能够提供具有以下奇怪行为的键的类型:true
- 可以无限次添加到字典中
- 无法使用检测到
ContainsKey
,因此...
- 永远无法使用
Remove
请记住,由于这个原因,这Equals
与它非常密切相关GetHashCode
(C# 编译器甚至会警告您,如果您在没有另一个的情况下覆盖了其中一个)——它们之所以存在的很大一部分原因是为了便于将类型用作哈希表键。
就像我说的,这只是一个猜测。