2011-11-03 29 views
14

LinqKit tiene un método de extensión ForEach para IEnumerable que choca con System.Collections.Generic.IEnumerable.C# métodos de extensión ambiguos

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

¿Cómo puedo eliminar este error?

+5

En una nota al margen - Eric Lippert tiene algunos puntos excelentes acerca de por qué un método de extensión 'ForEach' podría no ser la mejor idea ... Vale la pena leer: http://blogs.msdn.com/b/ericlippert/archive /2009/05/18/foreach-vs-foreach.aspx –

+0

Hablando de eso, ¿de qué biblioteca provienen 'System.Linq.EnumerableExtensionMethods'? – StriplingWarrior

+0

@ReedCopsey El razonamiento de Lippert es falso y refleja cómo la programación funcional fue añadida a C#, mal (por ejemplo, 'select' en lugar de' map', 'aggregate' en lugar de' foldl', no 'foldr' en absoluto ...). Scala, por el contrario, tiene un método 'foreach' aunque tiene una instrucción' for' que itera sobre colecciones ... de hecho, el bucle 'for' se expande a llamadas a' foreach' (entre otras cosas). Scala permite un estilo de codificación imperativo, pero de diversas maneras alienta a los programadores a avanzar hacia un estilo funcional a medida que adquieren más experiencia. –

Respuesta

22

Enumerable, en el marco, no declarará una extensión para ForEach(). Ambos son de referencias externas.

Debería considerar usar solo una de ellas, ya sea la referencia que agrega EnumerableExtensionMethods o la LinqKit.

(Esto, por cierto, es una de las razones que utilizando el mismo espacio de nombres como el marco causa problemas - en este caso, el autor de EnumerableExtensionMethods colocó en System.Linq, que va a causar un problema cada vez que está utilizando LINQ y usted tiene un choque espacio de nombres)

Si realmente necesita usar este método, entonces usted tendrá que llamar directamente en lugar de utilizar el método de extensión, es decir:.

LinqKit.Extensions.ForEach(collection, action); 

O:

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

Dicho esto, yo personalmente usaría un bucle foreach para procesar los elementos.

0

Simplemente necesita calificar completamente el método que está llamando, como en el mensaje de error.

Así, en lugar de utilizar

ForEach<Domain>(...); 

uso

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