Parallel.ForEach不喜欢IList

时间:2016-05-27 00:44:04

标签: c# list parallel.foreach

以下代码无法编译。

IList configurationItems = dataSourceService.Get(configurationClass);
Parallel.ForEach(configurationItems, configurationItem =>
{...}

Parallel.ForEach抱怨说,“无法从用法中推断出方法'ForEach(IEnumerable,Action)'的类型参数。请尝试明确指定类型参数。”

我已经尝试了我能想到的各种形式的演员表,但没有一个能奏效。我试图深入研究Parallel.ForEach的重载同样是不成功的。

1 个答案:

答案 0 :(得分:3)

您可以将IList设为IList<T>吗?

这里的问题是Parallel.ForEach的每次调用实际上都是Parallel.ForEach<T> - 带有类型参数的泛型方法。 C#编译器非常擅长在可能的情况下猜测类型参数。此方法具有签名ForEach<T>(IEnumerable<T>, Action<T>)。只要您提供IEnumerable<T>,编译器就会知道整个调用的T是什么。 IList不实现IEnumerable<T>,只实现IEnumerable,因此编译器无法确定要用于该方法的类型参数。这是抱怨。

或者,如果坚持使用IList,您可以使用

Parallel.ForEach<T>(configurationItems.OfType<T>(), (T item) => ....);

其中T是您想要的实际类型 我怀疑你不会需要ForEach方法的类型参数。您可能也不需要指定lambda表达式参数的类型。 OfType<T>可能足以让编译器推断出其余部分。