以下陈述完全可以.
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.WriteLine
成new Action<String>(Console.WriteLine)
适合你.
转换形式的拉姆达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的参数类型和修饰符