为什么两个委托实例返回相同的哈希码?

25 浏览
0 Comments

为什么两个委托实例返回相同的哈希码?

请看下面的代码:

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

为什么哈希码是相同的?

这有点令人惊讶,并且会使在字典中使用委托的速度和使用列表一样慢(即查找的时间复杂度为O(n))。

更新:

问题是为什么哈希码相同。换句话说,是谁做出了这样(愚蠢)的决定?

一个更好的哈希码实现应该是:

return Method ^ Target == null ? 0 : Target.GetHashcode();
// 其中Method是IntPtr类型

0