¿Por qué la variable local dentro del bucle foreach entra en conflicto con la variable declarada fuera del bucle?

Dado este código:

List things = new List(); foreach (string thing in things) { string foo = thing.ToUpper(); } string foo = String.Empty; 

¿Por qué el comstackdor se queja de que foo se declara dos veces? ¿Seguramente la instancia declarada en el bucle foreach solo es válida dentro del scope del bucle?

Si bien solo puede referirse al foo externo después de declararlo, los locales se asignan al comienzo de una función, lo que significa que el foo interno eclipsará al externo, incluso si aún no se ha declarado.