c# - Func<T> 是如何隐式转换为 Expression<Func<T>> 的?

标签 c# linq lambda expression linq-expressions

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

这两行编译:

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

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

但这不是:

 expression = func;

LambdaExpression 上没有隐式运算符或 Expression<TDelegate>将委托(delegate)转换为表达式,因此必须发生其他事情才能使分配工作。这是什么?

最佳答案

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

这就是为什么不能直接将 lambda 表达式赋给 objectvar 类型的变量的原因,因为编译器必须能够了解您指的是委托(delegate)还是表达式。

关于c# - Func<T> 是如何隐式转换为 Expression<Func<T>> 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5862266/

相关文章:

c# - 如何使用 System.Data.SQLite.Linq

.net - 如果您可以使用任何 .NET DAL 技术,您会选择什么?

LINQ 将字典转换为查找

c# - 通过 SSL 的 HttpWebRequest?

c# - .NET:如何在具有相似成员(类型和名称)的不同类之间复制数据?

python - Python 中 k、v 元组列表中的唯一组合

c++ - 如何在 C++ 中重载 std::function 签名

c# - 无法用 lambda 表达式替换字符串 propertyName 参数

c# - 使用多个命令在类中预定义字段

c# - 无法生成:Microsoft/aspnetcore的 list :2.1找不到Visual Studio 7.5.2 Mac OS X