Преобразование не работает, потому что компилятор не может определить, какой именно тип выражения вы пытаетесь создать. Что если ты сделал это?
Expression generalExpression = (object o) => "foo";
Должно ли это быть Expression<Func<object, string>>
? А как насчет Expression<Func<object, object>>
или Expression<Func<object, IComparable>>
? Все эти типы будут допустимым конечным типом для дерева выражений, и компилятор не претендует на то, что знает, что вы пытаетесь сделать.
Вам необходимо привести конкретный тип, чтобы сообщить компилятору, какой тип выражения вы хотите создать:
Expression generalExpression = (Expression<Func<object, object>>)
(object o) => new object();
Если вы попытаетесь это сделать, вы увидите похожую ошибку компилятора:
Delegate generalDelegate = delegate() { };
Является ли это Action
, или ThreadStart
, или каким-либо другим видом делегата без аргументов, возвращающего пустоту?