Это поведение описано в разделе 3 спецификации языка C #. Вот цитата из спецификации
Аналогично, любое выражение, которое
происходит как тело анонимного
функция в виде
лямбда-выражение создает
пространство объявления, которое содержит
параметры анонимной функции.
Это ошибка для двух членов
пространство объявления локальной переменной
иметь то же имя. Это ошибка для
пространство объявления локальной переменной
блока и вложенной локальной переменной
пространство объявлений для хранения элементов
с тем же именем. Таким образом, в течение
вложенное пространство декларации это не
можно объявить локальную переменную
или константа с тем же именем, что и
локальная переменная или постоянная в
пространство декларации.
Я думаю, что более простой способ прочитать это состоит в том, что с целью объявления переменной (и многих других связанных с блоком функций) блок лямбда / анонимного делегата обрабатывается не иначе, как обычный блок.
Относительно того, почему язык был разработан таким образом, в спецификации явно не указано. Мое мнение, хотя это простота. Если код рассматривается как просто еще один блок, то это облегчает процедуры анализа кода. Вы можете сохранить все существующие подпрограммы для анализа блока на наличие семантических ошибок и разрешения имен. Это особенно важно, когда вы рассматриваете переменный подъем. В конечном итоге лямбда-выражения будут другой функцией, но они по-прежнему будут иметь доступ ко всем переменным в области видимости в точке объявления.