Beim Erstellen neuer Objekte in einer LINQ-Anweisung, zum Beispiel:
var list = new List() { "a", "b", "c" };
var erstellt = from i in list select new A();
Mit der Klasse A, die so aussieht:
Klasse A
{
public string Label;
}
Und dann die Eigenschaften in A mit einer foreach-Schleife ändern:
foreach (var c in erstellt) {
c.Label = "Set";
}
Warum werden die Werte nicht gesetzt, wenn man anschließend auf die Objekte im IEnumerable
zugreift. z.B. die folgende Assertion schlägt fehl:
Assert.AreEqual("Set", erstellt.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. Die 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. Das Problem verschwindet, wenn man ToList
auf dem IEnumerable
aufruft, bevor man auf das erstellte Objekt zugreift.