Como posso capturar o valor de uma variável externa dentro de uma expressão lambda?

Acabei de encontrar o seguinte comportamento:

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

Resultará em uma série de "Error: x", onde a maioria dos x são iguais a 50.

Similarmente:

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

Irá resultar em "Using value: After".

Isso significa claramente que a concatenação na expressão lambda não ocorre imediatamente. Como é possível usar uma cópia da variável externa na expressão lambda, no momento em que a expressão é declarada? O seguinte não funcionará melhor (o que não é necessariamente incoerente, admito):

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

questionAnswers(4)

yourAnswerToTheQuestion