Подтвердить что ты не робот

Как Func <T> неявно преобразован в выражение <Func <T>>?

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

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

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

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

Но это не так:

 expression = func;

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

4b9b3361

Ответ 1

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

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