Область действия локальной переменной простирается вплоть до начала блока, в котором она объявлена.Таким образом, область действия вашей второй декларации как фактически всего внешнего цикла foreach
.Из спецификации C # 4, раздел 3.7:
Область локальной переменной, объявленной в объявлении локальной переменной (§8.5.1), является блоком, в котором происходит объявление.
и в разделе 8.5.1:
Область локальной переменной, объявленной в объявлении локальной переменной, - это блок, в котором происходит объявление.Ошибочно ссылаться на локальную переменную в текстовой позиции, которая предшествует объявителю локальной переменной локальной переменной.В рамках локальной переменной является ошибкой во время компиляции объявлять другую локальную переменную или константу с тем же именем.
Так что, хотя вторая переменная не была объявлена в точкетам, где возникает первая переменная, она все еще находится в области видимости - поэтому два объявления между ними нарушают 8.5.1.
Язык был разработан таким образом, чтобы предотвратить ошибки - было бы странно, если бы просто перемещалось местоположение локальногообъявление переменной в блоке, в котором она объявлена , и перед ее первым использованием изменила допустимость кода.