Почему сфера if и делегирует этот путь в c # - PullRequest
7 голосов
/ 01 января 2009

Вдохновленный этим вопросом Я начал задумываться, почему все следующие примеры недопустимы в c #:

VoidFunction t = delegate { int i = 0; };

int i = 1;

и

{
   int i = 0;
}

int i = 1;

Мне просто интересно, кто-нибудь знал точную причину, почему язык был разработан таким образом? Это препятствует плохой практике программирования, и если да, то почему бы просто не выдать предупреждение? Из соображений производительности (при компиляции и при запуске) или по какой причине?

Ответы [ 3 ]

9 голосов
/ 01 января 2009

Это поведение описано в разделе 3 спецификации языка C #. Вот цитата из спецификации

Аналогично, любое выражение, которое происходит как тело анонимного функция в виде лямбда-выражение создает пространство объявления, которое содержит параметры анонимной функции. Это ошибка для двух членов пространство объявления локальной переменной иметь то же имя. Это ошибка для пространство объявления локальной переменной блока и вложенной локальной переменной пространство объявлений для хранения элементов с тем же именем. Таким образом, в течение вложенное пространство декларации это не можно объявить локальную переменную или константа с тем же именем, что и локальная переменная или постоянная в пространство декларации.

Я думаю, что более простой способ прочитать это состоит в том, что с целью объявления переменной (и многих других связанных с блоком функций) блок лямбда / анонимного делегата обрабатывается не иначе, как обычный блок.

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

2 голосов
/ 01 января 2009

Я думаю, что это сделано таким образом, чтобы внутренняя область видимости могла обращаться к переменным, объявленным во внешней области видимости. Если вам было разрешено перезаписывать переменные, существующие во внешней области видимости, может возникнуть путаница относительно того, какое поведение было задумано. Поэтому они, возможно, решили решить проблему, не допуская ее возникновения.

0 голосов
/ 01 января 2009

Я думаю, что таким образом можно предотвратить попадание разработчиков в ногу.

...