【问题标题】:Parallel.ForEach Doesn't Like IListParallel.ForEach 不喜欢 IList
【发布时间】:2016-05-27 00:44:03
【问题描述】:

以下代码无法编译。

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

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

我尝试了所有我能想到的演员表形式,但都没有奏效。我尝试深入研究 Parallel.ForEach 的重载也同样失败。

【问题讨论】:

  • 你能用IList<T>吗?
  • doco 明确指出IList 没有立即暗示的IEnumerable<T> 的要求时,不确定为什么这有4 票。正如丹尼尔所说,使用IList<T>

标签: c# list parallel.foreach


【解决方案1】:

你能把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&lt;T&gt; 可能足以让编译器推断其余部分。

【讨论】:

  • 建议的修饰导致集合参数出现错误情况,“无法从'方法组'转换为 IEnumerable
  • 请显示您在尝试修复时使用的确切代码(请随时编辑您的问题以显示尝试,因为在那里格式化更容易)。该错误使我猜测您提供了该方法作为参数,而不是调用它的结果。
  • (尝试在OfType&lt;T&gt;后面加括号)
  • 谢谢。不知道我怎么没有碰巧硬选这个名单。 IList configurationItems = dataSourceService.Get(configurationClass) as IList;
  • 您应该使用Cast&lt;T&gt;(),而不是OfType&lt;T&gt;()。这样,很明显您没有过滤掉其他类型的项目。如果你犯了错误,你会得到一个异常而不是错误的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2022-08-03
  • 2022-12-13
  • 1970-01-01
相关资源
最近更新 更多