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看起来非常混乱。