2011-11-03 23 views
14

LinqKit bir uzantısı yöntem System.Collections.Generic.IEnumerable ile çakışan IEnumerable için ForEach sahiptir.C# belirsiz uzantısı yöntemleri

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>)' 

Bu hatadan nasıl kurtulabilirim?

+5

- Eric Lippert'ın bir 'ForEach' uzatma yöntemi iyi bir fikir olmayabilir neden bazı büyük noktaları vardır ... Bu okunmaya değer var: http://blogs.msdn.com/b/ericlippert/archive /2009/05/18/foreach-vs-foreach.aspx –

+0

Hangi sistem kütüphanesi 'System.Linq.EnumerableExtensionMethods' türedi? – StriplingWarrior

+0

@ReedCopsey Lippert'in akıl yürütme mantıklıdır ve işlevsel programlamanın C# ile zayıf bir şekilde nasıl ilişkilendirildiğini yansıtır (örneğin, 'map' yerine 'select ',' foldl 'yerine' select 'yerine' foldr '). Scala, aksine, koleksiyonlar üzerinde yineleyen bir “for” ifadesine sahip olsa bile, bir “foreach” yöntemine sahiptir ... aslında “for” döngüsü foreach'a (diğer şeylerin yanı sıra) çağrıları genişletir. Scala, zorunlu bir kodlama stiline izin verir, ancak çeşitli şekillerde programcıları daha deneyimli hale geldiklerinde işlevsel bir stile doğru hareket etmeye teşvik eder. –

cevap

22

Enumerable kullanmak yerine, ForEach() için bir uzantı bildirmiyor. Bunların ikisi de dış referanslardan.

Yalnızca bunlardan birini kullanmayı düşünmelisiniz: EnumerableExtensionMethods veya LinqKit ekleyen referans.

(Bu, btw çerçeve sorunlarına neden aynı ad kullanarak bu bir nedeni - bir konuyu sen Linq kullandığınız her zaman neden oluyor bu durumda, EnumerableExtensionMethods yazarı System.Linq yerleştirdi ve bir ad çatışması var)

gerçekten bu yöntemi kullanmak gerekiyorsa, o zaman bunu aramak zorunda yerine doğrudan uzantısı yöntemi kullanılarak edeceğiz yani.

LinqKit.Extensions.ForEach(collection, action); 

Veya:

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

Yani, kişisel olarak sadece öğeleri işlemek için bir foreach döngüsünü kullanacağım. Yan not

0

Sadece hata mesajında ​​olduğu gibi, aradığınız yöntemi tam nitelemek gerekir.

Yani, yerine çerçevesinde,

ForEach<Domain>(...); 

kullanımını

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