阅读此相关answer后 - 我还有一个问题
lambda表达式是一个代替委托实例编写的未命名方法。 编译器立即将lambda表达式转换为:
但当转换它时会执行委托实例 - 当将其转换为表达式树时? (没有找到关于那个的相关信息)
没有太多相关的代码 - 只是试着玩它 - 显然都是匹配的。我不这么认为,因为我认为一个人会更好。
void Main()
{
Foo( () => 0 );
}
void Foo(Func<int > action)
{
Console.WriteLine("1");
}
void Foo(Expression<Func<int>> func)
{
Console.WriteLine("2");
}
这将导致错误(以下方法或属性之间不明确)
答案 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表达式转换为表达式树。