Func 是如何实现的?隐式转换为表达式>?

发布于 2024-11-04 19:37:32 字数 376 浏览 0 评论 0 原文

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

这两行都编译:

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

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

但这不是:

 expression = func;

LambdaExpressionExpression 上没有隐式运算符它将委托转换为表达式,因此必须发生其他事情才能使分配起作用。它是什么?

I don't understand what is happening here:

Both of these lines compile:

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

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

But this doesn't:

 expression = func;

There isn't an implicit operator on LambdaExpression or Expression<TDelegate> that converts a delegate to the expression, so something else must be happening to make the assignment work. What is it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柠北森屋 2024-11-11 19:37:32

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

这就是您不能直接将 lambda 表达式分配给 objectvar 类型的变量的原因,因为编译器必须能够知道是否你的意思是一个委托或一个表达式。

It's not an implicit conversion in the usual sense - it's a compiler trick. The compiler detects which one is expected from the context, and then compiles it either as a delegate (a hidden method on your class) or as an expression (a chunk of code that constructs the expression by calling the methods on System.Linq.Expressions.Expression).

This is the reason you can't directly assign a lambda expression to a variable of type object or var, among other things, because the compiler has to be able to know whether you mean a delegate or an expression.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文