Lambda表达式委托实例或表达式树?

时间:2014-04-23 10:44:36

标签: c# .net-4.5

阅读此相关answer后 - 我还有一个问题

lambda表达式是一个代替委托实例编写的未命名方法。 编译器立即将lambda表达式转换为:

  • 委托实例。
  • Expression类型的表达式树,表示内部代码 可遍历对象模型中的lambda表达式。

转换它时会执行委托实例 - 将其转换为表达式树时? (没有找到关于那个的相关信息)

没有太多相关的代码 - 只是试着玩它 - 显然都是匹配的。我不这么认为,因为我认为一个人会更好。

void Main()
{
     Foo( () => 0 );
}
  void Foo(Func<int > action)
{
    Console.WriteLine("1");
}

  void Foo(Expression<Func<int>> func)
{
    Console.WriteLine("2");
}

这将导致错误(以下方法或属性之间不明确)

1 个答案:

答案 0 :(得分:5)

它会转换为您要求的任何类型。例如:

Func<int> del = () => 0; // Conversion to delegate
Expression<Func<int>> expression = () => 0; // Conversion to expression tree

在您的情况下,由于重载,您要求编译器考虑转换到两个表单。如果删除了Foo(Expression<Func<int>> func)方法,则代码有效,编译器会将lambda表达式转换为委托。如果您删除了另一个方法,代码将是有效的,编译器会将lambda表达式转换为表达式树。