c# - Expression 和 Delegate 之间的转换错误

标签 c# lambda delegates expression expression-trees

我们可以编写如下代码:

 Func<string, string> func = x => x + x;

我们也可以这样写:

 Expression<Func<string, string>> exp = x => x + x;

但是当我写的时候:

Expression<Func<string, string>> exp = func;

编译器抛出一个错误:

Cannot implicitly convert type 'System.Func' to 'System.Linq.Expressions.Expression>'

所以我把代码改成如下:

  Expression<Func<string, string>> exp = (Expression<Func<string, string>>)func;

和以前一样的错误。

那么 x => x + x; 的真实类型是什么,Expression 和 Delegate/Lambda Expression 之间的关系是什么?

最佳答案

So what's the real type of x => x + x;

它没有。 lambda 表达式可隐式转换为兼容的委托(delegate)类型和表达式树类型(有一些限制),但该决定是在编译时做出的,并且会根据转换目标生成不同的代码.

您可以在执行时将表达式树转换为委托(delegate)(使用 LambdaExpression.Compile ),但不能反过来。

基本上,lambda 表达式是某些逻辑的源表示。编译器可以生成该逻辑的代码表示(转换为委托(delegate))或该逻辑的数据表示(转换为表达式树)。非常具体地说,对于表达式树,生成的代码将构建数据表示。

关于c# - Expression 和 Delegate 之间的转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37048250/

相关文章:

c# - 运行docker.exe时vsdbg的权限问题-exec:\“/app/vsdbg\:权限被拒绝

c# - 我可以在 C# 的两个不同类中使用相同的枚举吗?

ios - UITextFieldDelegate : How to select which methods gets called for each individual TextField

c# - 在 C# 中附加事件处理程序的两种不同方式是否存在实际差异?

objective-c - 为 NSXMLParser 设置委托(delegate),给出 SIGABRT 错误

c# - Application Insights 上未显示异常详细信息

c# - 作为新手,在学习C#之前有什么需要注意的地方吗?

c# - 通过编程 Linq/Lambda 创建订单

java - 根据关键 java 流将 HashMap 列表分组为 HashMap 列表

c# - 在 C# 中使用 Entity Framework 搜索数据​​库