Почему в С# область действия if и делегатов такая?

StackOverflow https://stackoverflow.com/questions/405116

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

int i = 1;

и

{
   int i = 0;
}

int i = 1;

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top