Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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#方法群体陌生度_C#_Lambda_Method Group - Fatal编程技术网

C#方法群体陌生度

C#方法群体陌生度,c#,lambda,method-group,C#,Lambda,Method Group,我发现了一些非常奇怪的东西,我希望能更好地理解 var all = new List<int[]>{ new int[]{1,2,3}, new int[]{4,5,6}, new int[]{7,8,9} }; all.ForEach(n => n.ForEach(i => Console.WriteLine(i))); 如何能够省去lambd

我发现了一些非常奇怪的东西,我希望能更好地理解

var all = new List<int[]>{
                new int[]{1,2,3},
                new int[]{4,5,6},
                new int[]{7,8,9}
              };

all.ForEach(n => n.ForEach(i => Console.WriteLine(i)));
如何能够省去lambda表达式参数(i=>)而仍将当前项传递给console.WriteLine

谢谢你的洞察力。 -Keith

列表。ForEach
正在寻找
操作。当你写作时

n.ForEach(Console.WriteLine);
n.ForEach(i => Console.WriteLine(i));
这里您拥有的是方法组
控制台的一个成员。WriteLine
扮演
操作的角色。编译器将查找吃
int
实例的
Console.WriteLine
的最佳重载。事实上,它将使用重载。然后,它将使用此重载扮演
操作的角色

有关如何实现这一点的详细信息,请参见本规范的§6.6(方法组转换)

然而,当你写作的时候

n.ForEach(Console.WriteLine);
n.ForEach(i => Console.WriteLine(i));
实际上,我们有一个非常不同的
操作
在第一种情况下,
操作
控制台。WriteLine(int)
。这里,
操作
相当于您编写了

public static void DoSomething(int i) {
    Console.WriteLine(i);
}
然后

n.ForEach(DoSomething);
(当然,编译器必须经历与上述相同的方法组过程,才能理解
DoSomething
的含义)


关键是在第一种情况下,
操作
控制台。WriteLine(int)
。但是,在第二种情况下,<代码>动作<代码>是一个中间人(lambda表达式),它本身将调用<代码>控制台。 您正在将方法传递给委托参数。大多数时候,我们在事件上下文中考虑委托,但它们也可以是方法的参数。当一个方法被添加到一个没有参数的事件中时,它看起来并不奇怪,只是在这个上下文中执行时看起来很不寻常


在LAMBDAS之前,你必须一直这样做,这是一种痛苦,以至于人们永远不会考虑使用像LINQ这样的图书馆。使用Lambdas,这更容易做到,但您也可以始终使用旧的方法来完成。

++对于编译器“吃掉”Console.WriteLine重载的图像!非常清楚地表达。非常感谢。C#2.0有匿名委托语法(
delegate(){}
),但它的语法糖不够甜,会使LINQ看起来非常混乱。