我对一行代码感到有点困惑:
Enumerable.Range(1,10).ToList().ForEach(Console.WriteLine);
这条线的功能与它所说的一样,它打印出每个数字从1到10,每个数字之间都有换行符,所有这些都带有一条简洁的代码行。
现在我只是一个C#新手充其量,但它对我来说看起来完全陌生,如何在不提供任何参数的情况下调用Console.WriteLine()
?它是如何知道打印的?从这种语法来看,我甚至不清楚我们是否正在调用一种方法(考虑到WriteLine
周围缺乏关注)。
我假设有很多事情正在进行中"在幕后"在这里,但我不太擅长阅读IL代码,从我收集的阅读MSIL看起来ForEach
调用了一个通用代理(System.Action
)收集,我猜它然后将元素作为参数传递给System.Action
代表,但这只是我的猜测..
答案 0 :(得分:4)
从方法组(在本例中为Console.WriteLine
)和兼容的委托类型进行隐式转换。您的代码实际上与
Action<int> f = Console.WriteLine;
Enumerable.Range(1,10).ToList().ForEach(f);
兼容
答案 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
是此类方法之一