Почему этот запрос LINQ компилируется?

Прочитав « Нечетные выражения запроса » Джона Скита, я попробовал приведенный ниже код. Я ожидал, что 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;
    }
}

5
задан Tj Kellie 30 September 2010 в 20:17
поделиться