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
委托,但这只是我的猜测。。
方法组(本例中为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
就是这样的方法之一