ForEach扩展方法

本文关键字:方法 扩展 ForEach | 更新日期: 2023-09-27 17:59:06

我对一行代码有点困惑:

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

这行按它说的做,它打印出从1到10的每个数字,每个数字之间都有一个换行符,所有这些都需要一行整洁的代码。。

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

我假设这里有很多"幕后"工作,但我不太擅长阅读IL代码,从我收集的阅读MSIL的信息来看,ForEach似乎对集合中的每个元素调用了一个泛型委托(System.Action),我猜它会将元素作为参数传递给System.Action委托,但这只是我的猜测。。

ForEach扩展方法

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

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

委托f与方法void Console.WriteLine(int) 兼容

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

是的缩写

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

它被称为MethodGroup

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