Прочитав « Нечетные выражения запроса » Джона Скита, я попробовал приведенный ниже код.
Я ожидал, что LINQ-запрос в конце будет преобразован в int query = proxy.Where (x => x) .Select (x => x);
, который не компилируется, потому что Где
возвращает int
. Код компилируется и выводит на экран «Where (x => x)», а для запроса устанавливается значение 2. Select никогда не вызывается, но он должен присутствовать для компиляции кода. Что происходит?
using System;
using System.Linq.Expressions;
public class LinqProxy
{
public Func>,int> Select { get; set; }
public Func>,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;
}
}