C# Parallel.ForEach不';我不喜欢IList

C# Parallel.ForEach不';我不喜欢IList,c#,list,parallel.foreach,C#,List,Parallel.foreach,以下代码不编译 IList configurationItems = dataSourceService.Get(configurationClass); Parallel.ForEach(configurationItems, configurationItem => {...} Parallel.ForEach抱怨,“无法从用法推断方法‘ForEach(IEnumerable,Action)’的类型参数。请尝试显式指定类型参数。” 我尝试了我能想到的每一种类型的演员,但没有一种有效。

以下代码不编译

IList configurationItems = dataSourceService.Get(configurationClass);
Parallel.ForEach(configurationItems, configurationItem =>
{...}
Parallel.ForEach抱怨,“无法从用法推断方法‘ForEach(IEnumerable,Action)’的类型参数。请尝试显式指定类型参数。”


我尝试了我能想到的每一种类型的演员,但没有一种有效。我试图深入研究Parallel.ForEach的重载也没有成功。

你能把
IList
变成
IList

这里的问题是,
Parallel.ForEach
的每次调用实际上都是
Parallel.ForEach
——一个带有类型参数的通用方法。在可能的情况下,C#编译器非常擅长猜测类型参数。此方法有一个签名
ForEach(IEnumerable, 操作)
。只要提供一个
IEnumerable
,编译器就知道整个调用的
T
是什么
IList
没有实现
IEnumerable
,只是
IEnumerable
,因此编译器无法计算该方法使用的类型参数。这就是这里的抱怨

或者,如果使用
ILST
卡滞,您可以使用

Parallel.ForEach<T>(configurationItems.OfType<T>(), (T item) => ....);
Parallel.ForEach(configurationItems.OfType(),(T项)=>;
其中T是您想要的实际类型。

不过,我怀疑您不需要ForEach方法上的type参数。您可能也不需要指定lambda表达式参数的类型<类型为的code>可能足以让编译器推断出其余的部分。

你能使用一个
IList
吗?不确定为什么它有4个投票权,而该投票权清楚地说明了
IEnumerable
的要求,而
IList
并不立即意味着这一点。使用
IList
如Daniel所述,建议的装饰会导致集合参数出现错误,“无法从'method group'转换为IEnumerable”请显示您在尝试修复时使用的确切代码(请随意编辑您的问题以显示尝试,因为在那里更容易格式化)。这个错误使我猜测您提供的方法是作为参数,而不是调用它的结果。(尝试在类型的
后面添加括号)谢谢。我不知道我是怎么把名单硬定的。IList configurationItems=dataSourceService.Get(configurationClass)作为IList;您应该使用
Cast()
,而不是类型()的
。这样,很明显,您没有过滤掉其他类型的项目。如果你犯了错误,你会得到一个异常而不是错误的结果。