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;
LambdaExpression
或 Expression<TDelegate>
上没有将委托转换为表达式的隐式运算符,因此必须发生其他事情才能使赋值起作用。这是什么?
【问题讨论】:
【参考方案1】:这不是通常意义上的隐式转换 - 这是一个编译器技巧。编译器从上下文中检测出哪个是预期的,然后将其编译为委托(类中的隐藏方法)或表达式(通过调用System.Linq.Expressions.Expression
上的方法构造表达式的代码块)。
这就是您不能直接将 lambda 表达式分配给 object
或 var
类型的变量等原因,因为编译器必须能够知道您是指委托还是表达式.
【讨论】:
更多here. 最后一个 - 再加上它需要决定要使用的什么委托类型(或代表类型的表达式);Func<...>
等没有什么特别之处。以上是关于Func<T> 如何隐式转换为 Expression<Func<T>>?的主要内容,如果未能解决你的问题,请参考以下文章
无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”
从 Expression<Func<T, bool>> 转换为字符串
将(隐式)提升 shared_ptr<T> 转换为 shared_ptr<const T>