以下代码无法编译。
IList configurationItems = dataSourceService.Get(configurationClass);
Parallel.ForEach(configurationItems, configurationItem =>
{...}
Parallel.ForEach抱怨说,“无法从用法中推断出方法'ForEach(IEnumerable,Action)'的类型参数。请尝试明确指定类型参数。”
我已经尝试了我能想到的各种形式的演员表,但没有一个能奏效。我试图深入研究Parallel.ForEach的重载同样是不成功的。
答案 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>
可能足以让编译器推断出其余部分。