2016-05-27 4 views
4

次のコードはコンパイルされません。Parallel.ForEachはIListを好まない

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

Parallel.ForEachは、「方法 『のForEach(IEnumerableを、アクション)』の型引数は、使用状況から推測することはできません。明示的に型引数を指定してみてください。」、文句を言います

私は考えることのできるあらゆる形式のキャストを試みましたが、どれも動作しません。 Parallel.ForEachのオーバーロードを掘り下げようとした私も、失敗しました。

+4

あなたは 'IList 'を使用できますか? –

+0

[doco](https://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.foreach(v = vs.110).aspx)が明確に表示されている理由'IList'が直ちに暗示しない' IEnumerable 'の要件を述べています。 Danielの状態で「IList 」を使用してください – MickyD

答えて

3

IListIList<T>にできますか?

Parallel.ForEachのすべての呼び出しは、実際にはParallel.ForEach<T> - タイプ引数を持つ汎用メソッドです。可能であれば、型引数を推測するのにC#コンパイラはかなり良いです。このメソッドのシグニチャーはForEach<T>(IEnumerable<T>, Action<T>)です。 IEnumerable<T>を指定している限り、コンパイラは呼び出し全体についてTが何であるかを知っています。 IListIEnumerable<T>を実装していません。ちょうどIEnumerableなので、コンパイラはメソッドに使用する型引数を決めることができません。これはここでの苦情です。

また、IListで立ち往生している場合、あなたは、Tは、あなたがしたい実際の型である

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

を使用することができます。
私はあなたがForEachメソッドで型引数を必要としないと思う。ラムダ式の引数の型も指定する必要はありません。 OfType<T>はおそらく残りの部分を推論するのにコンパイラで十分です。

+0

提案されている装飾によって、コレクションパラメータに「メソッドグループからIEnumerable に変換できません」というエラー状態が発生します –

+0

修正しようとしたときの正確なコードを表示してください試してみるのが簡単なので質問を編集してください)。このエラーは、メソッドを呼び出した結果ではなく、引数としてメソッドを提供したと推測されます。 – moreON

+0

( 'OfType 'の後にかっこを追加してください) –

関連する問題