【发布时间】:2017-10-23 12:03:21
【问题描述】:
目标: ForEach 扩展掩码选择。
原因: Select 允许方法链接,而 foreach 不允许; ForEach 比 Select 更具可读性。
我遇到的问题是我收到了这个错误。
无法从用法中推断方法“System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable, System.Func)”的类型参数。尝试明确指定类型参数。 (CS0411)
public static void ForEach<T>(this IEnumerable<T> elements, Action<T, int> action)
{
elements.Select((elem, i) => action(elem, i));
}
我尝试过elements.Select((T elem, int i) => action(elem, i));,但这会产生同样的错误。
我也尝试过使用 Func 代替 Action,但似乎没有任何方法可以使用 void 作为返回值(无论如何,这就是 Action 的用途)。如果我将方法定义为采用 Func 而不是 Action,那么当我尝试使用 Action 调用它时,我会得到同样的错误。
public static IEnumerable<TOut> ForEach<TIn, TOut>(this IEnumerable<TIn> elements,
Func<TIn, int, TOut> function)
{
return elements.Select((elem, i) => function(elem, i))
.ToList();
}
我不明白哪些参数无法推断。有一些方法可以解决这个问题(使用 for 循环或 foreach 循环并跟踪索引),但我仍然想弄清楚为什么这不起作用。
编辑:当我从 foreach 循环切换到调用 Select 时,我还刚刚意识到我的另一个 ForEach for Action(无索引)也出现此错误。
public static void ForEach<T>(this IEnumerable<T> elements, Action<T> action)
{
elements.ToList().Select((T elem) => action(elem));
/*foreach (var elem in elements)
action(elem);*/
}
【问题讨论】:
-
为什么要使用
Select?如果你想写ForEach,只需使用foreach语句... -
请注意,如果您的第一个方法已编译,由于延迟评估,它实际上不会做任何事情。
-
你不明白任何的错误吗?你明白
Select的意思是进行投影,从一种类型转到另一种类型吗?鉴于action(elem)和action(elem, i)不返回任何内容,您希望编译器在这里推断什么? -
如果您只想弄清楚为什么它不起作用,那么 that 应该是既定目标 - 因为在顶部的目标的最佳答案问题是“使用 foreach 循环”(在您的 ForEach 实现中)。
-
@BlakeThingstad IEnumerable
是什么样的?