В С# все типы делегатов несовместимы друг с другом, даже если они имеют одну и ту же подпись. В качестве примера:
delegate void D1();
delegate void D2();
D1 d1 = MethodGroup;
D2 d2 = d1; // compile time error
D2 d2 = new D2 (d1); // you need to do this instead
В чем причина такого поведения и решения для языкового дизайна.