Jak mogę przechwycić wartość zmiennej zewnętrznej wewnątrz wyrażenia lambda?

Właśnie spotkałem następujące zachowanie:

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

Powoduje serię „Błąd: x”, gdzie większość x równa się 50.

Podobnie:

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

Spowoduje to „Używanie wartości: Po”.

Oznacza to wyraźnie, że konkatenacja w wyrażeniu lambda nie następuje natychmiast. W jaki sposób można użyć kopii zmiennej zewnętrznej w wyrażeniu lambda w momencie zadeklarowania wyrażenia? Poniższe nie będą działać lepiej (co niekoniecznie jest niespójne, przyznaję):

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

questionAnswers(4)

yourAnswerToTheQuestion