Por qué enumerar a través de una colección arroja una excepción, pero recorrer sus elementos no

Estaba probando algunas construcciones de sincronización y noté algo que me confundió. Cuando estaba enumerando a través de una colección mientras le escribía al mismo tiempo, arrojó una excepción (esto se esperaba), pero cuando recorrí la colección usando un bucle for, no fue así. ¿Alguien puede explicar esto? Pensé que una Lista no permite que un lector y un escritor operen al mismo tiempo. Hubiera esperado recorrer la colección para exhibir el mismo comportamiento que usar un enumerador.

UPDATE: este es un ejercicio puramente académico. Entiendo que enumerar una lista es malo si se está escribiendo al mismo tiempo. También entiendo que necesito una construcción de sincronización. Mi pregunta nuevamente fue acerca de por qué la operación una arroja una excepción como se esperaba pero la otra no.

Code está debajo:

   class Program
   {
    private static List<string> _collection = new List<string>();
    static void Main(string[] args)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(AddItems), null);
        System.Threading.Thread.Sleep(5000);
        ThreadPool.QueueUserWorkItem(new WaitCallback(DisplayItems), null);
        Console.ReadLine();
    }

    public static void AddItems(object state_)
    {
        for (int i = 1; i <= 50; i++)
        {
            _collection.Add(i.ToString());
            Console.WriteLine("Adding " + i);
            System.Threading.Thread.Sleep(150);
        }
    }

    public static void DisplayItems(object state_)
    {
        // This will not throw an exception
        //for (int i = 0; i < _collection.Count; i++)
        //{
        //    Console.WriteLine("Reading " + _collection[i]);
        //    System.Threading.Thread.Sleep(150);
        //}

        // This will throw an exception
        List<string>.Enumerator enumerator = _collection.GetEnumerator();
        while (enumerator.MoveNext())
        {
            string value = enumerator.Current;
            System.Threading.Thread.Sleep(150);
            Console.WriteLine("Reading " + value);
        }
    }
}

Respuestas a la pregunta(7)

Su respuesta a la pregunta