ForEach扩展方法

时间:2014-04-19 20:22:27

标签: c# linq

我对一行代码感到有点困惑:

Enumerable.Range(1,10).ToList().ForEach(Console.WriteLine);

这条线的功能与它所说的一样,它打印出每个数字从1到10,每个数字之间都有换行符,所有这些都带有一条简洁的代码行。

现在我只是一个C#新手充其量,但它对我来说看起来完全陌生,如何在不提供任何参数的情况下调用Console.WriteLine()?它是如何知道打印的?从这种语法来看,我甚至不清楚我们是否正在调用一种方法(考虑到WriteLine周围缺乏关注)。

我假设有很多事情正在进行中"在幕后"在这里,但我不太擅长阅读IL代码,从我收集的阅读MSIL看起来ForEach调用了一个通用代理(System.Action)收集,我猜它然后将元素作为参数传递给System.Action代表,但这只是我的猜测..

3 个答案:

答案 0 :(得分:4)

从方法组(在本例中为Console.WriteLine)和兼容的委托类型进行隐式转换。您的代码实际上与

相同
Action<int> f = Console.WriteLine;
Enumerable.Range(1,10).ToList().ForEach(f);

代理f与方法void Console.WriteLine(int)

兼容

答案 1 :(得分:2)

Enumerable.Range(1,10).ToList().ForEach(Console.WriteLine)

的缩写
Enumerable.Range(1,10).ToList().ForEach(text => Console.WriteLine(text));

它被称为MethodGroup

答案 2 :(得分:0)

Foreach语句是通用语句,在您的情况下,它是ForEach<int>。它需要一个Action<int>类型的参数,任何接受单int参数的void方法都可以用于此目的。 Console.WriteLine是此类方法之一