There is no implicit conversion between the two delegates for the same reason that there is no implicit conversion between the two types:
public sealed class Foo1 { public string Value { get; set; } } public sealed class Foo2 { public string Value { get; set; } }
Just because two classes have the same fields, this does not mean that you should be able to treat it as if it were different. The same logic applies to delegates (which also apply to types, mind you).
There is a semantic meaning applied to the creation of this type. If someone created Foo1 , he wants him to be Foo1 , not Foo2 . If they do not want to use Foo1 , where Foo2 is expected, this is a big red flag, which, although the types are similar, is the semantic difference between the two types. If a programmer knows something that is not in the compiler, he can use an explicit conversion of some kind to indicate that they know what they are doing.
(The preceding paragraph was intentionally written to apply your delegates and the classes mentioned above equally).
source share