Func<T> 如何隐式转换为 Expression<Func<T>>?

Posted

技术标签:

【中文标题】Func<T> 如何隐式转换为 Expression<Func<T>>?【英文标题】:How is a Func<T> implicitly converted to Expression<Func<T>>? 【发布时间】:2011-08-17 06:19:24 【问题描述】:

我不明白这里发生了什么:

这两行都编译:

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

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

但这不是:

 expression = func;

LambdaExpressionExpression&lt;TDelegate&gt; 上没有将委托转换为表达式的隐式运算符,因此必须发生其他事情才能使赋值起作用。这是什么?

【问题讨论】:

【参考方案1】:

这不是通常意义上的隐式转换 - 这是一个编译器技巧。编译器从上下文中检测出哪个是预期的,然后将其编译为委托(类中的隐藏方法)或表达式(通过调用System.Linq.Expressions.Expression 上的方法构造表达式的代码块)。

这就是您不能直接将 lambda 表达式分配给 objectvar 类型的变量等原因,因为编译器必须能够知道您是指委托还是表达式.

【讨论】:

更多here. 最后一个 - 再加上它需要决定要使用的什么委托类型(或代表类型的表达式); Func&lt;...&gt; 等没有什么特别之处。

以上是关于Func<T> 如何隐式转换为 Expression<Func<T>>?的主要内容,如果未能解决你的问题,请参考以下文章

无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”

将 generic<T> 隐式转换回 T

从 Expression<Func<T, bool>> 转换为字符串

将(隐式)提升 shared_ptr<T> 转换为 shared_ptr<const T>

这种 Nullable<T> 行为与隐式转换运算符的理由是啥

转换表达式树