2011-11-03 13 views
14

LinqKit ma metodę rozszerzenia ForEach dla IEnumerable, która koliduje z System.Collections.Generic.IEnumerable.Metody niejednoznacznych rozszerzeń 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>)' 

Jak mogę się pozbyć tego błędu?

+5

Na marginesie - Eric Lippert ma kilka świetnych wskazówek na temat, dlaczego metoda rozszerzenia "ForEach" może nie być najlepszym pomysłem ... Warto przeczytać: http://blogs.msdn.com/b/ericlippert/archive /2009/05/18/foreach-vs-foreach.aspx –

+0

Skoro o tym mowa, z jakiej biblioteki pochodził 'System.Linq.EnumerableExtensionMethods'? – StriplingWarrior

+0

@ReedCopsey Rozumowanie Lipperta jest nieprawdziwe i odzwierciedla, jak funkcjonalne programowanie zostało przypisane do C#, słabo (np. 'Select' zamiast' map', 'aggregate' zamiast' foldl', no 'foldr' w ogóle ...). Natomiast Scala ma metodę 'foreach', mimo że posiada instrukcję' for', która iteruje nad kolekcjami ... w rzeczywistości pętla 'for' rozszerza się na wywołania' foreach' (między innymi). Scala pozwala na imperatywny styl kodowania, ale na różne sposoby zachęca programistów do przejścia w stronę stylu funkcjonalnego, gdy stają się bardziej doświadczeni. –

Odpowiedz

22

Enumerable, w ramach, nie deklaruje rozszerzenie dla ForEach(). Oba pochodzą z zewnętrznych źródeł.

Należy rozważyć użycie tylko jednego z nich - albo odniesienia, które dodaje się EnumerableExtensionMethods lub LinqKit.

(To, przy okazji, jest jednym z powodów, że przy użyciu tej samej przestrzeni nazw jako ramy powoduje problemy - w tym przypadku, autor EnumerableExtensionMethods umieścił go w System.Linq, co będzie powodować problem w każdej chwili jesteś przy użyciu LINQ i masz starcia namespace)

Jeśli naprawdę trzeba użyć tej metody, to trzeba będzie nazwać bezpośrednio zamiast stosując metodę rozszerzenia, tj.

LinqKit.Extensions.ForEach(collection, action); 

Lub:

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

Powiedziałbym, że osobiście użyłbym pętli foreach do przetworzenia elementów.

0

Po prostu musisz w pełni zakwalifikować metodę, do której dzwonisz, tak jak w komunikacie o błędzie.

Więc, zamiast korzystania

ForEach<Domain>(...); 

korzystanie

LinqKit.Extensions.ForEach<Domain>(...); 
Powiązane problemy