Warum wird diese LINQ-Abfrage bei Verwendung von foreach nicht ausgeführt?

Beim Erstellen neuer Objekte in einer LINQ-Anweisung, zum Beispiel:

var list = new List<string>() { "a", "b", "c" };
var created = from i in list select new A();

Wenn Klasse A so aussieht:

class A
{
    public string Label;
}

Und dann Eigenschaften in A mit einer foreach-Schleife ändern:

foreach (var c in created) {
    c.Label = "Set";
}

Warum werden die Werte beim Zugriff auf die Objekte im nicht gesetzt?IEnumerable danach. Z.B. Die folgende Behauptung schlägt fehl:

Assert.AreEqual("Set", created.ElementAt(2).Label);

Ich frage mich, warum das passiert. Ich würde erwarten, dass die foreach-Anweisung die Abfrage ausführt und die Erstellung der Objekte auslöst. MSDN-Dokumentation besagt:"Die Ausführung der Abfrage wird verzögert, bis die Abfragevariable in einer foreach- oder For Each-Schleife durchlaufen wird.".

Ich habe dieses Verhalten mit .NET 4.5 und Mono 3.2.0 reproduziert. BerufungToList auf derIEnumerable vor dem Zugriff auf das erstellte Objekt lässt sich dieses Problem beheben.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage