Parallel.ForEach 不喜欢 IList

Dan*_*Lee 5 c# list parallel.foreach

以下代码无法编译。

IList configurationItems = dataSourceService.Get(configurationClass);
Parallel.ForEach(configurationItems, configurationItem =>
{...}
Run Code Online (Sandbox Code Playgroud)

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

我尝试过所有我能想到的演员阵容,但没有一个有效。我尝试深入研究 Parallel.ForEach 的重载也同样不成功。

mor*_*eON 3

你能做IList一个IList<T>吗?

\n\n

这里的问题是,每次调用Parallel.ForEach实际上都是Parallel.ForEach<T>带有类型参数的泛型方法。C# 编译器非常擅长在可能的情况下猜测类型参数。这个方法有一个签名ForEach<T>(IEnumerable<T>,\xe2\x80\x82Action<T>)。只要您提供一个,IEnumerable<T>编译器就知道T整个调用的内容。IList不实现IEnumerable<T>,只是IEnumerable,因此编译器无法计算出该方法使用什么类型参数。这是这里的投诉。

\n\n

或者,如果卡住了IList你可以使用

\n\n
Parallel.ForEach<T>(configurationItems.OfType<T>(), (T item) => ....);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

  • 您应该使用“Cast&lt;T&gt;()”,而不是“OfType&lt;T&gt;()”。这样,很明显您不会过滤掉其他类型的项目。如果你犯了一个错误,你会得到一个异常,而不是错误的结果。 (3认同)