In C# all delegate types are incompatible with one another, even if they have the same signature. As an example:
delegate void D1(); delegate void D2(); D1 d1
Delegate is nothing but just another type. They are incompatible for the same reason class A {} and class B {} would be incompatible.
class A {}
class B {}
delegate void D1();
Will approximately compile to something like:
class D1 : MulticastDelegate { .... }