C#模糊扩展方法

14

LinqKit提供了一个对于IEnumerable的扩展方法ForEach,该方法会与System.Collections.Generic.IEnumerable冲突。

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 - Reed Copsey
说到这个,System.Linq.EnumerableExtensionMethods 库是来自哪里的? - StriplingWarrior
@ReedCopsey Lippert的推理是错误的,反映了函数式编程如何被拼接到C#上的问题(例如,使用select代替map,使用aggregate代替foldl,根本没有foldr...)。相比之下,Scala有一个foreach方法,即使它有一个for语句来迭代集合...实际上,for循环会扩展为调用foreach(以及其他一些东西)。Scala允许命令式编码风格,但在各种方式上鼓励程序员朝着函数式风格发展。 - Jim Balter
2个回答

23

Enumerable在框架中没有声明ForEach()扩展。这两个来自外部引用。

你应该考虑仅使用其中之一,或者使用添加了EnumerableExtensionMethods的那个引用或者LinqKit

(顺便说一句,这是使用与框架相同的命名空间会导致问题的原因之一 - 在这种情况下,EnumerableExtensionMethods的作者将它放在System.Linq中,任何时候使用Linq并且有命名空间冲突都会引起问题。)

如果你真的需要使用这个方法,那么你就必须直接调用它而不是使用扩展方法,即:

LinqKit.Extensions.ForEach(collection, action);

或者:

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

话虽如此,个人建议使用foreach循环来处理元素。


0
你只需要像错误信息中那样完全限定所调用的方法即可。
因此,不要使用:
ForEach<Domain>( ... );

使用

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

如果该方法是通用的,并且您正在使用匿名类型,则没有“简单地完全限定”。 - springy76

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接