Я нашел следующее довольно странным. Опять же, я в основном использовал замыкания в динамических языках, которые не должны вызывать ту же «ошибку». Компилятор недоволен следующим:
VoidFunction t = delegate { int i = 0; };
int i = 1;
В нем говорится:
Локальная переменная с именем «i» не может быть объявлена в этой области, потому что это дало бы другое значение «i», которое уже используется в «дочерней» области для обозначения чего-то еще.
Таким образом, это в основном означает, что переменные, объявленные внутри делегата, будут иметь область действия, объявленную в функции. Не совсем то, что я ожидал. Я даже не пытался вызвать функцию. По крайней мере, в Common Lisp есть функция, в которой вы говорите, что переменная должна иметь динамическое имя, если вы действительно хотите, чтобы оно было локальным. Это особенно важно при создании макросов, которые не утекают, но что-то подобное и здесь было бы полезно.
Поэтому мне интересно, что другие люди делают, чтобы обойти эту проблему?
Чтобы уточнить, я ищу решение, в котором переменные, которые я объявляю в делегате, не пересекаются с переменными, объявленными после делегата. И я хочу по-прежнему иметь возможность захватывать переменные, объявленные перед делегатом.