Resurrection diferencia en el uso de Object Initializer

Tengo este código:

Esencialmente estoy tratando de demostrar el uso del finalizador de c # y hacer un objeto que no pueda morir, lo llamé Zombie. Ahora, normalmente esta demostración funciona muy bien, pero hoy intenté usar el mismo código con el inicializador de objeto en lugar de solo asignarlo a la propiedad (Nombre en este caso). Noté que hay una diferencia. Es decir, que nunca se llama al finalizador, ni siquiera cuando estoy haciendo todo lo posible para que el recolector de basura haga su trabajo.

¿Alguien podría explicar la diferencia, o he encontrado un error en el compilador de C #?

(Estoy usando C # 4 en VS2010 SP1 en Win7x64)

Gracias

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Zombie
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Main thread: " + Thread.CurrentThread.ManagedThreadId);

              // case 1: this is where the problem is located.
      Zombie z = new Zombie { Name = "Guy" }; // object initializer syntax makes that the finalizer is not called.

              // case 2: this is not causing a problem. The finalizer gets called.
      //Zombie z = new Zombie();
      //z.Name = "Guy";

      WeakReference weakZombieGuyRef = new WeakReference(z, true);

      z = null;

      GC.GetTotalMemory(forceFullCollection: true);

      GC.Collect();

      while (true)
      {

        Console.ReadKey();
        if (weakZombieGuyRef.IsAlive)
        {
          Console.WriteLine("zombie guy still alive");
        }
        else
        {
          Console.WriteLine("Zombie guy died.. silver bullet anyone?");
        }

        Zombie.Instance = null;

        GC.AddMemoryPressure(12400000);
        GC.GetTotalMemory(forceFullCollection: true);

        GC.Collect();
      }


    }
  }

  public class Zombie
  {
    public string Name { get; set; }
    public  static Zombie Instance = null;

    ~Zombie()
    {
      Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
      Console.WriteLine("Finalizer called on zombie" + this.Name);
      lock (typeof(Zombie))
      {
        Instance = this;

        GC.ReRegisterForFinalize(this);
      }
    }
  }
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta