Take the following:
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);
This will print:
True
False
Why is the hashcode the same?
It is kinda surprising, and will make using delegates in a Dictionary as slow as a List (aka O(n) for lookups).
Update:
The question is why. IOW who made such a (silly) decision?
A better hashcode implementation would have been:
return Method ^ Target == null ? 0 : Target.GetHashcode();
// where Method is IntPtr
Easy! Since here is the implementation of the
GetHashCode(sitting on the base classDelegate):(sitting on the base class
MulticastDelegatewhich will call above):Using tools such as Reflector, we can see the code and it seems like the default implementation is as strange as we see above.
The type value here will be
Action. Hence the result above is correct.UPDATE