Dlaczego to zapytanie LINQ nie jest wykonywane podczas korzystania z foreach?

Podczas tworzenia nowych obiektów w instrukcji LINQ, na przykład:

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

Z klasą A wyglądającą tak:

class A
{
    public string Label;
}

A następnie modyfikowanie właściwości w A za pomocą pętli foreach:

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

Dlaczego wartości nie są ustawiane podczas uzyskiwania dostępu do obiektów wIEnumerable potem. Na przykład. następujące stwierdzenie nie powiedzie się:

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

Zastanawiam się, dlaczego tak się dzieje. Oczekiwałbym, że instrukcja foreach wykona zapytanie i wywoła tworzenie obiektów. Dokumentacja MSDN stwierdza:„Wykonanie zapytania jest odroczone, dopóki zmienna zapytania nie zostanie powtórzona w pętli foreach lub For Each”.

Powtórzyłem to zachowanie za pomocą .NET 4.5 i Mono 3.2.0. PowołanieToList naIEnumerable przed uzyskaniem dostępu do utworzonego obiektu problem ten zniknie.

questionAnswers(1)

yourAnswerToTheQuestion