C# Lambda表达式到委托实例或表达式树?

C# Lambda表达式到委托实例或表达式树?,c#,.net-4.5,C#,.net 4.5,读完这篇相关的文章后,我仍然有一个问题 lambda表达式是代替委托实例编写的未命名方法。 编译器立即将lambda表达式转换为: 委托实例 表达式树,类型为表达式,表示内部代码 可遍历对象模型中的lambda表达式 但它什么时候转换为委托实例?什么时候转换为表达式树?(找不到关于那个的相关信息) 没有太多相关的代码-只是尝试使用它-显然两者都是匹配的。我不这么认为,因为我认为一个会更好 void Main() { Foo( () => 0 ); } void Foo(F

读完这篇相关的文章后,我仍然有一个问题

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

  • 委托实例
  • 表达式树,类型为表达式,表示内部代码 可遍历对象模型中的lambda表达式
但它什么时候转换为委托实例?什么时候转换为表达式树?(找不到关于那个的相关信息)

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

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

  void Foo(Expression<Func<int>> func)
{
    Console.WriteLine("2");
}
void Main()
{
Foo(()=>0);
}
无效Foo(函数操作)
{
控制台。写入线(“1”);
}
void Foo(表达式函数)
{
控制台。写入线(“2”);
}

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

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

Func<int> del = () => 0; // Conversion to delegate
Expression<Func<int>> expression = () => 0; // Conversion to expression tree
Func del=()=>0;//转为代表
表达式=()=>0;//转换为表达式树

在您的情况下,您要求编译器考虑到两种形式的转换,因为重载。如果删除了

Foo(Expression func)
方法,代码将有效,编译器将把lambda表达式转换为委托。如果您删除了另一个方法,则代码将有效,编译器将把lambda表达式转换为表达式树。

我不确定是否理解。如果您使用自己的委托,比如说
delegate int Blah()
,并使用
void Foo(Blah Blah)
@leppie,同样的情况也会发生。代码来自Jon在链接中写的内容,我试着玩了一下。我只是问是什么让编译器将其转换为委托实例VS表达式树,它将转换为您有效要求的任何形式。您的代码不明确,因为它可以转换为
Func
Expression
,并且两种转换都不被视为“更好”。不清楚你在问什么。@JonSkeet你是说上下文是编译器决定的吗?例如,linq-2-sql会将其转换为表达式树…?就个人而言,我甚至不会为这种重载而烦恼。只要给它一个不同的名字,问题就解决了;P