Kei*_*ith 13 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)));
Run Code Online (Sandbox Code Playgroud)
可以改写为:
...
all.ForEach(n => n.ForEach(Console.WriteLine));
Run Code Online (Sandbox Code Playgroud)
如何省略lambda表达式参数(i =>)并仍然将当前项传递给console.WriteLine?
感谢您的任何见解.-Keith
jas*_*son 33
List<T>.ForEach正在寻找一个Action<T>.当你写作
n.ForEach(Console.WriteLine);
Run Code Online (Sandbox Code Playgroud)
你在这里有一个方法组的成员之一Console.WriteLine扮演一个角色Action<T>.编译器将查找Console.WriteLine该eats实例的最佳重载int.实际上,它会使用过载Console.WriteLine(int).然后它将使用此重载来扮演一个角色Action<int>.
有关如何完成此操作的详细信息,请参阅规范的§6.6(方法组转换).
但是,当你写作
n.ForEach(i => Console.WriteLine(i));
Run Code Online (Sandbox Code Playgroud)
我们实际上有一个非常不同的Action<int>在第一种情况下,Action<int>是Console.WriteLine(int).在这里,Action<int>相当于你写的
public static void DoSomething(int i) {
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
然后
n.ForEach(DoSomething);
Run Code Online (Sandbox Code Playgroud)
(当然,编译器必须经历与上述相同的方法组过程以找出其含义DoSomething).
关键是在第一种情况下Action<int> 是 Console.WriteLine(int).然而,在第二种情况下,它Action<int>是一个本身将调用的中间人(lambda表达式)Console.WriteLine(int).
| 归档时间: |
|
| 查看次数: |
2397 次 |
| 最近记录: |