Parallel.ForEach 不喜欢 IList

Parallel.ForEach Doesn't Like IList

以下代码无法编译。

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

Parallel.ForEach抱怨,"The type arguments for method 'ForEach(IEnumerable,Action)' cannot be inferred from the usage. Try specifying the type arguments explicitly."

我已经尝试了我能想到的每一种演员表形式,并且 none 都有效。我试图深入研究 Parallel.ForEach 的重载的尝试同样没有成功。

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