Wie kann ich den Wert einer äußeren Variablen in einem Lambda-Ausdruck erfassen?

Ich bin gerade auf folgendes Verhalten gestoßen:

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

Wird zu einer Reihe von "Error: x" führen, wobei die meisten x gleich 50 sind.

Ähnlich:

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

Ergibt "Using value: After".

Dies bedeutet eindeutig, dass die Verkettung im Lambda-Ausdruck nicht sofort auftritt. Wie ist es möglich, eine Kopie der äußeren Variablen im Lambda-Ausdruck zum Zeitpunkt der Deklaration des Ausdrucks zu verwenden? Folgendes wird nicht besser funktionieren (was nicht unbedingt inkohärent ist, gebe ich zu):

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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage