Cómo anular correctamente el registro de un controlador de eventos

En una revisión de código, me topé con este fragmento de código (simplificado) para cancelar el registro de un controlador de eventos:

 Fire -= new MyDelegate(OnFire);

Pensé que esto no anula el registro del controlador de eventos porque crea un nuevo delegado que nunca antes se había registrado. Pero buscando en MSDN encontré varias muestras de código que usan este modismo.

Entonces comencé un experimento:

internal class Program
{
    public delegate void MyDelegate(string msg);
    public static event MyDelegate Fire;

    private static void Main(string[] args)
    {
        Fire += new MyDelegate(OnFire);
        Fire += new MyDelegate(OnFire);
        Fire("Hello 1");
        Fire -= new MyDelegate(OnFire);
        Fire("Hello 2");
        Fire -= new MyDelegate(OnFire);
        Fire("Hello 3");
    }

    private static void OnFire(string msg)
    {
        Console.WriteLine("OnFire: {0}", msg);
    }

}

Para mi sorpresa, sucedió lo siguiente:

Fire("Hello 1"); produjo dos mensajes, como se esperaba.Fire("Hello 2"); producido un mensaje!
Esto me convenció de que no registrarmenew delegados trabaja!Fire("Hello 3"); arrojó unNullReferenceException.
La depuración del código mostró queFire esnull después de anular el registro del evento.

Sé que para los controladores de eventos y los delegados, el compilador genera mucho código detrás de escena. Pero todavía no entiendo por qué mi razonamiento está mal.

¿Qué me estoy perdiendo?

Pregunta adicional: del hecho de queFire esnull cuando no hay eventos registrados, concluyo que en todas partes se dispara un evento, un cheque contranull es requerido.

Respuestas a la pregunta(2)

Su respuesta a la pregunta