Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';允许在lambda表达式中消除参数的技术的名称是什么?_C#_Lambda - Fatal编程技术网

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减少或方法组转换。你的问题的措辞听起来有点像结束语。

我把这称为一个代表的传递。对不起,我不知道