Я нашел этот вопрос, о том, какие языки оптимизируют хвостовую рекурсию. Почему С# не оптимизирует хвостовую рекурсию, когда это возможно?
Для конкретного случая, почему этот метод не оптимизирован в цикл (Visual Studio 2008 32-бит, если это имеет значение ):
private static void Foo(int i)
{
if (i == 1000000)
return;
if (i % 100 == 0)
Console.WriteLine(i);
Foo(i+1);
}