2011-11-03 6 views
14

LinqKitはSystem.Collections.Generic.IEnumerableと衝突するIEnumerableの拡張メソッドForEachを持っています。C#曖昧な拡張方法

Error 4 The call is ambiguous between the following methods or properties: 
'LinqKit.Extensions.ForEach<Domain>(System.Collections.Generic.IEnumerable<Domain>, System.Action<Domain>)' 
and 
'System.Linq.EnumerableExtensionMethods.ForEach<Domain>(System.Collections.Generic.IEnumerable<Domain>, System.Action<Domain>)' 

どうすればこのエラーを取り除くことができますか?

+5

Eric Lippertは、なぜForEach拡張メソッドがベストアイデアではないのか、いくつかの素晴らしい点を持っています。読む価値があります:http://blogs.msdn.com/b/ericlippert/archive /2009/05/18/foreach-vs-foreach.aspx –

+0

「System.Linq.EnumerableExtensionMethods」はどのライブラリから来たのですか? – StriplingWarrior

+0

@ReedCopsey Lippertの推論は、偽であり、関数型プログラミングがC#にどのようにして組み込まれているかを反映していません(例えば、maplの代わりに 'select'、' foldl'の代わりに 'aggregate'、全くfoldr'がありません...)。対照的に、Scalaは、コレクションに対して繰り返すfor文を持っていても 'foreach'メソッドを持っています...実際に' for'ループは 'foreach'(他のものの中でも)の呼び出しに展開されます。 Scalaは命令的なコーディングスタイルを可能にしますが、さまざまな方法で、プログラマーはより多くの経験を積むように機能スタイルに移行することを奨励します。 –

答えて

22

Enumerable使用は、フレームワークでは、ForEach()の拡張子を宣言していません。どちらも外部参照のものです。

EnumerableExtensionMethodsまたはLinqKitを追加している参照のいずれか1つのみを使用することを検討してください。

(これは、フレームワークと同じ名前空間を使用すると、この場合、EnumerableExtensionMethodsの投稿者がSystem.Linqに配置されているため、Linqを使用しているときにいつでも問題が発生するあなたは、名前空間の衝突を持っている)

あなたは本当に、このメソッドを使用する必要がある場合、その後、あなたはそれを呼び出す必要がなく、直接の拡張メソッドを使用します、すなわち:。

LinqKit.Extensions.ForEach(collection, action); 

または:

System.Linq.EnumerableExtensionMethods.ForEach(collection, action); 

私は個人的には、要素を処理するためにforeachループを使用します。

0

エラーメッセージのように、呼び出しているメソッドを完全修飾するだけで済みます。

ので、代わりに

ForEach<Domain>(...); 

を使用しての

LinqKit.Extensions.ForEach<Domain>(...);