Как Func <T>неявно преобразуется в выражение <Func <T>>? - PullRequest
17 голосов
/ 03 мая 2011

Я не понимаю, что здесь происходит:

Обе эти строки компилируются:

 Func<object> func = () => new object();

 Expression<Func<object>> expression = ()=>new object();

Но это не так:

 expression = func;

В LambdaExpression или Expression<TDelegate> нет неявного оператора, который преобразует делегат в выражение, поэтому для выполнения назначения должно произойти что-то еще. Что это?

1 Ответ

29 голосов
/ 03 мая 2011

Это не неявное преобразование в обычном смысле - это трюк с компилятором.Компилятор определяет, какой из них ожидается из контекста, а затем компилирует его либо как делегат (скрытый метод в вашем классе), либо как выражение (кусок кода, который создает выражение, вызывая методы на System.Linq.Expressions.Expression).

По этой причине вы не можете напрямую назначить лямбда-выражение переменной типа object или var, помимо прочего, потому что компилятор должен знать, имеете ли вы в виду делегатили выражение.

...