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