Почему этот запрос LINQ не выполняется при использовании foreach?
При создании новых объектов в операторе LINQ, например:
var list = new List<string>() { "a", "b", "c" };
var created = from i in list select new A();
С классом А выглядит так:
class A
{
public string Label;
}
И затем изменение свойств в A с помощью цикла foreach:
foreach (var c in created) {
c.Label = "Set";
}
Почему значения не установлены при доступе к объектам вIEnumerable
после этого. Например. следующее утверждение не выполняется:
Assert.AreEqual("Set", created.ElementAt(2).Label);
Интересно, почему это происходит? Я ожидаю, что оператор foreach выполнит запрос и инициирует создание объектов. Документация MSDN гласит:«Выполнение запроса откладывается до тех пор, пока переменная запроса не будет повторена в цикле foreach или For Each».
Я воспроизвел это поведение с .NET 4.5 и Mono 3.2.0. призваниеToList
наIEnumerable
прежде чем получить доступ к созданному объекту, проблема исчезнет.