In C# quando un evento è dichiarato abstract in una classe, in quella classe non è possibile ne testare se l'evento è null e nemmeno notificare l'evento (errore CS0079, The event can only appear on the left hand side of += or -=).
Dichiarandolo virtual nella classe base e facendo l'override nella classe derivata, quando l'evento viene notificato dalla classe base vengono ignorate le sottoscrizioni fatte dalla classe derivara (il compilatore crea due field distinti e privati su cui registrare le sottoscrizioni, uno per la classe base e l'altro per la classe derivata).
Dichiarando l'evento abstract e specificando gli accessor(1) add e remove, quando si indica il body degli accessor il compilatore VC#2003 da l'errore CS0500 (cannot declare a body because it is marked abstract) e quando lo si toglie da l'errore CS0073 (An add or remove accessor must have a body).
La soluzione c'è(2) ma il compilatore resta... strano!
_____________
(1) Gli event in C# dichiarano in automatico una variabile privata di tipo delegate e creano in automatico gli accessor add e remove che permettono di sottoscriversi ad un evento (con la classica sintassi +=) oppure di rimuovere la sottoscrizione (con la classica sintassi -=). Il programmatore quando lo desidera può implementare gli accessor add e remove nel modo che preferisce.
(2) Nella classe base dichiarare il field protected (del tipo di delegate relativo all'evento) e usare questo field per testare se l'evento è null e per notificare l'evento. Nella classe derivata dichiarare l'evento con gli accessor add e remove e nel body implementare l'add e remove facendo uso del field protected della classe base.