Как я могу получить значение внешней переменной внутри лямбда-выражения?

Я только что столкнулся со следующим поведением:

for (var i = 0; i < 50; ++i) {
    Task.Factory.StartNew(() => {
        Debug.Print("Error: " + i.ToString());
    });
}

Результатом будет серия «Ошибка: х», где большинство х равно 50.

Так же:

var a = "Before";
var task = new Task(() => Debug.Print("Using value: " + a));
a = "After";
task.Start();

Результатом будет & quot; Использование значения: после & quot ;.

Это ясно означает, что конкатенация в лямбда-выражении происходит не сразу. Как можно использовать копию внешней переменной в лямбда-выражении во время объявления выражения? Следующее не будет работать лучше (что не обязательно противоречиво, я признаю):

var a = "Before";
var task = new Task(() => {
    var a2 = a;
    Debug.Print("Using value: " + a2);
});
a = "After";
task.Start();

Ответы на вопрос(4)

Ваш ответ на вопрос