C# 什么';允许在lambda表达式中消除参数的技术的名称是什么?
下面的陈述完全正确C# 什么';允许在lambda表达式中消除参数的技术的名称是什么?,c#,lambda,C#,Lambda,下面的陈述完全正确 var sb = new string[] { "line1", "line2" }; sb.ForEach(Console.WriteLine); // same as sb.ForEach(item => Console.WriteLine(item)); 这种不在lambda表达式中使用参数的做法叫什么 谢谢,您正在寻找的术语是“方法组转换”。它会自动将一组方法(重载)转换为委托 在本例中,Console.WriteLine是一组大约19个不同的方法,所有方法
var sb = new string[] { "line1", "line2" };
sb.ForEach(Console.WriteLine);
// same as sb.ForEach(item => Console.WriteLine(item));
这种不在lambda表达式中使用参数的做法叫什么
谢谢,您正在寻找的术语是“方法组转换”。它会自动将一组方法(重载)转换为委托
在本例中,
Console.WriteLine
是一组大约19个不同的方法,所有方法都使用相同的名称重载。然后,编译器将确定这些重载之一是否与预期的委托兼容(Action
是唯一的一个)。由于有一个匹配,它会为您将Console.WriteLine
转换为newaction(Console.WriteLine)
调用将形式为方法(x=>f(x))
的lambda转换为方法(f)
。我不知道C#编译器是否在内部执行eta缩减,但它确实支持将方法组(在您的例子中是Console.WriteLine)转换为委托类型(这里可能是Action
)
C#编译器将在操作
委托中包装重载控制台。WriteLine(string)
,并将其传递给ForEach
方法
C#规范定义了将方法组转换为兼容委托类型的规则:
6.6方法组转换
存在从方法组(§7.1)到方法组的隐式转换(§6.1)
兼容的委托类型。给定委托类型D和表达式E
如果被归类为方法组,则存在隐式转换
从E到D,如果E至少包含一种适用于
其标准形式(§7.5.3.1)为使用
D的参数类型和修饰符
虽然前面的两个答案都是正确的,但如果您有如下代码,还有一个额外的答案:
int i = 7;
return () => Foo(i);
这就是所谓的闭包,因为虽然lambda没有参数,但它在父范围中包含整数。当使用返回的匿名方法时,它仍然能够使用变量i,就好像它从未超出范围一样……因为它是封闭的,所以它没有
根据您最初的问题,您演示了eta减少或方法组转换。你的问题的措辞听起来有点像结束语。我把这称为一个代表的传递。对不起,我不知道