Почему 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<double>();   // uses default EqualityComparer<double>

    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)

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