Почему Microsoft не хочет исправлять неправильные реализации Equals и GetHashCode с NaN? [закрыто]

В .NET Framework, реализация (override) изEquals(object) а такжеGetHashCode() для типов с плавающей точкой (System.Double а такжеSystem.Single) являетсянеправильно, Цитировать изMSDNGetHashCode(object) Спецификация:

Хеш-функция должна иметь следующие свойства:

 Если два объекта сравниваются как равные, метод GetHashCode для каждого объекта должен возвращать одинаковое значение. Однако, если два объекта не сравниваются как равные, методы GetHashCode для двух объектов не должны возвращать разные значения.

Если взять дваNaN значения с различными двоичными представлениями, два объекта сравниваются равными подEquals метод, но хэш-коды (почти всегда) различны.

Теперь эта ошибка имеетбыло сообщено в Microsoft Connect.Но почему они не исправят это?

Исправить несложно: либо давай разныеNaN не сравнить как равный или выбрать фиксированный хеш-код для возврата для любого.NaN

Исправление победилоничего не сломать: так, как сегодня, ничего не работает, когда по-другомуNaN используются.

Ты можешь думать олюбой причина не исправить это?

Вот'Простой пример, иллюстрирующий текущее поведение:

using System;
using System.Collections.Generic;
using System.Linq;

static class Program
{
  const int setSize = 1000000; // change to higher value if you want to waste even more memory
  const double oneNaNToRuleThemAll = double.NaN;
  static readonly Random randomNumberGenerator = new Random();

  static void Main()
  {
    var set = new HashSet();   // uses default EqualityComparer

    while (set.Count < setSize)
      set.Add(GetSomeNaN());

    Console.WriteLine("We now have a set with {0:N0} members", set.Count);
    bool areAllEqualToTheSame = set.All(oneNaNToRuleThemAll.Equals);
    if (areAllEqualToTheSame)
      Console.WriteLine("By transitivity, all members of the set are (pairwise) equal.");
  }

  static double GetSomeNaN()  // can also give PositiveInfinity, NegativeInfinity (unlikely)
  {
    byte[] b = new byte[8];
    randomNumberGenerator.NextBytes(b);
    b[7] |= 0x7F;
    b[6] |= 0xF0;
    return BitConverter.ToDouble(b, 0);
  }
}

Результат выполнения кода: миллион дубликатов в.HashSet

ОБРАТИТЕ ВНИМАНИЕ: это имеетничего такого вообще делать с== а также!= операторы C #. Пожалуйста, используйтеEquals если вы хотите проверить это сами.

Ответы на вопрос(0)

Ваш ответ на вопрос