После прочтения «Odd query expressions» от Jon Skeet, я попробовал код ниже. Я ожидал, что запрос LINQ в конце перевести на int query = proxy.Where(x => x).Select(x => x);
, который не компилируется, потому что Where
возвращает int
. Код скомпилирован и печатает «Where (x => x)» на экране, а запрос - на 2. Select никогда не вызывается, но он должен быть там, где код должен компилироваться. Что происходит?Почему этот запрос LINQ компилируется?
using System;
using System.Linq.Expressions;
public class LinqProxy
{
public Func<Expression<Func<string,string>>,int> Select { get; set; }
public Func<Expression<Func<string,string>>,int> Where { get; set; }
}
class Test
{
static void Main()
{
LinqProxy proxy = new LinqProxy();
proxy.Select = exp =>
{
Console.WriteLine("Select({0})", exp);
return 1;
};
proxy.Where = exp =>
{
Console.WriteLine("Where({0})", exp);
return 2;
};
int query = from x in proxy
where x
select x;
}
}
См. Также http://blogs.msdn.com/b/ericlippert/archive/2008/05/12/trivial-projections-are-usually-optimized-away.aspx для нескольких дополнительных мыслей об этой функции. –