2011-11-03 127 views
14

對於IEnumerable,LinqKit有一個擴展方法ForEach,它與System.Collections.Generic.IEnumerable相沖突。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#中,很差(例如,'select'而不是'map','aggregate'而不是'foldl',根本沒有'foldr'...)。相比之下,Scala有一個'foreach'方法,即使它有一個迭代集合的'for'語句......事實上,'for'循環擴展爲調用'foreach'(等等)。 Scala支持一種強制性的編碼風格,但以各種方式鼓勵程序員在他們變得更有經驗時逐漸轉向功能風格。 –

回答

22

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>(...);