Возьмите следующее:
var x = new Action(() => { Console.Write("") ; });
var y = new Action(() => { });
var a = x.GetHashCode();
var b = y.GetHashCode();
Console.WriteLine(a == b);
Console.WriteLine(x == y);
Это напечатает:
True
False
Почему хэш-код такой же?
Это немного удивительно, и использование делегатов в Dictionary
будет таким же медленным, как List
(он же O(n)
для поиска).
Обновление:
Вопрос в том, почему. IOW, кто принял такое (глупое) решение?
Лучшей реализацией хэш-кода было бы:
return Method ^ Target == null ? 0 : Target.GetHashcode();
// where Method is IntPtr
Delegate.Equals
: Определяет, относятся ли указанный объект и текущий делегат к одному и тому же типу и используют одни и те же цели, методы и список вызовов. - person CodesInChaos   schedule 08.07.2011Target.GetHashCode
вместо использования ссылочного равенства. - person CodesInChaos   schedule 08.07.2011Action
в качестве входных данных. Попытка выяснить способ УНИКАЛЬНОЙ идентификации действий. пока не нашел :( - person Alex from Jitbit   schedule 10.11.2017