В разделе «Примечания для разработчиков» в документации по методу GetHashCode
интерфейса IEqualityComparer<T>
указано:
Реализации необходимы для обеспечения того, чтобы, если метод Equals
возвращает true для двух объектов x и y, затем значение, возвращаемое
Метод GetHashCode для x должен равняться значению, возвращенному для y.
Хорошо известно, почему вы хотите, чтобы два экземпляра T
возвращали один и тот же хеш-код, если два элемента равны; их различие означало бы, что они не равны, а то, что они одинаковы, означает, что они потенциально равны.
Я интерпретирую кавычку как неопределенную для возвращаемого значения, когда два экземпляра не равны (хотя их значения могут указывать на это).
Возьмем, к примеру, следующее. У меня есть последовательность int?
, которую я хочу использовать для статистической классификации , где каждый ненулевой int?
представляет атрибут класса (думаю, перечислите значения). В случае, когда эти значения являются нулевыми, вы не хотите, чтобы значения считались равными, поскольку они сместили бы тренировочный набор в сторону пропущенных значений. Во всяком случае, вы бы хотели, чтобы в этом случае нулевые значения при сравнении с другими нулевыми значениями возвращали false.
Дело в том, что в методе GetHashCode
, когда ему дано значение NULL, я, вероятно, захочу вернуть 0 (или какое-то другое число, например Int32.MinValue
). Теперь я знаю, что когда что-то вводится с помощью этой реализации IEqualityComparer<T>
, производительность для проверки наличия ключа в словаре не будет оптимальной для этих случаев.
Тем не менее, допустимо ли возвращать значение, о котором известно, что оно конфликтует, с другими значениями, когда вызывается GetHashCode
, когда вызов Equals
возвращает false? Я склоняюсь к да, так как приведенная выше цитата не определена в этом вопросе.