Por que essa consulta LINQ não é executada ao usar foreach?
Ao criar novos objetos em uma instrução LINQ, por exemplo:
var list = new List<string>() { "a", "b", "c" };
var created = from i in list select new A();
Com a classe A assim:
class A
{
public string Label;
}
E então modificando propriedades em A com um loop foreach:
foreach (var c in created) {
c.Label = "Set";
}
Por que os valores não são definidos ao acessar os objetos noIEnumerable
depois. Por exemplo. a seguinte afirmação falha:
Assert.AreEqual("Set", created.ElementAt(2).Label);
Eu me pergunto por que isso acontece. Eu esperaria que a instrução foreach executasse a consulta e acionasse a criação dos objetos. A documentação do MSDN indica:"A execução da consulta é adiada até que a variável de consulta seja iterada em um loop foreach ou For Each".
Eu reproduzi esse comportamento com o .NET 4.5 e o Mono 3.2.0. ChamandoToList
noIEnumerable
antes de acessar o objeto criado, esse problema desaparece.