允许在lambda表达式中消除参数的技术的名称是什么?

gur*_*umi 2 c# lambda

以下陈述完全可以.

var sb = new string[] { "line1", "line2" };
sb.ForEach(Console.WriteLine); 
// same as sb.ForEach(item => Console.WriteLine(item));
Run Code Online (Sandbox Code Playgroud)

这种练习的名称是什么,不使用lambda表达式中的参数?

谢谢,

Gab*_*abe 10

"方法组转换"是您正在寻找的术语.它会自动将一组方法(重载)转换为委托.

在这种情况下,Console.WriteLine是一组约19种不同的方法都使用相同的名称重载.然后,编译器会确定其中一个重载是否与预期的委托兼容(Action<String>是唯一的委托).由于有一个匹配,将其转换Console.WriteLinenew Action<String>(Console.WriteLine)适合你.


Lee*_*Lee 8

转换形式的拉姆达Method(x => f(x))Method(f)被称为ETA减少.我不知道C#编译器是否在内部执行eta缩减,但它确实支持将方法组(在您的情况下为Console.WriteLine)转换为委托类型(可能Action<string>在此处).

C#编译器将Console.WriteLine(string)Action<string>委托中包装重载并将其传递给您的ForEach方法.

C#规范定义了将方法组转换为兼容委托类型的规则:

6.6方法组转换

从方法组(第7.1节)到兼容的委托类型存在隐式转换(第6.1节).给定委托类型D和被分类为方法组的表达式E,如果E包含至少一个以其正常形式(第7.5.3.1节)适用于构造的参数列表的方法,则存在从E到D的隐式转换通过使用D的参数类型和修饰符