Это работает, потому что первая сборка мусора не собирает экземпляр. Он просто планирует запуск финализатора для экземпляра. Затем финализатор создает новый корень для экземпляра, поэтому, когда происходит следующая коллекция, экземпляр фактически укореняется и, следовательно, не собирается для сбора.
Вы должны быть очень осторожны с этим жестом. Если финализатор используется для того, чтобы убедиться, что объект удален, это фактически нарушает протокол, потому что одноразовые шаблоны говорят, что удаленный экземпляр должен генерировать исключение ObjectDisposedException, если он используется после удаления.