Если бы я рискнул предположить, возможно, это связано с поддержкой использования значений double
в качестве ключей в словаре.
Если x.Equals(y)
вернул 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 # даже предупреждает вас, если вы переопределили один без другого) - большая часть того, почему они есть в первом место для облегчения использования типов в качестве ключей хеш-таблицы.
Как я уже сказал, это всего лишь предположение.