2011-11-03 20 views
14

लिंककिट में 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

एक तरफ नोट पर - एरिक लिपर्ट के पास कुछ महान बिंदु हैं कि क्यों 'फॉरएच' एक्सटेंशन विधि सबसे अच्छा विचार नहीं हो सकता है ... यह पढ़ने योग्य है: http://blogs.msdn.com/b/ericlippert/archive /2009/05/18/foreach-vs-foreach.aspx –

+0

किसके बारे में बात करते हुए, 'System.Linq.EnumerableExtensionMethods' किस लाइब्रेरी से आया था? – StriplingWarrior

+0

@ रीडकोप्सी लिपर्ट का तर्क फर्जी है और यह दर्शाता है कि कार्यात्मक प्रोग्रामिंग को सी # पर कैसे खराब किया गया था, उदाहरण के लिए, 'मैप' के बजाय' चयन ', 'फ़ोल्ड' के बजाय' कुल ', कोई' फ़ोल्डर 'नहीं ...)। स्कैला, इसके विपरीत, एक 'foreach' विधि है, भले ही उसके पास' कथन 'है जो संग्रहों पर पुनरावृत्ति करता है ... असल में,' लूप '' foreach' (अन्य चीजों के साथ) को कॉल करने के लिए विस्तारित करता है। स्कैला एक अनिवार्य कोडिंग शैली की अनुमति देता है, लेकिन विभिन्न तरीकों से प्रोग्रामर को एक कार्यात्मक शैली की ओर बढ़ने के लिए प्रोत्साहित किया जाता है क्योंकि वे अधिक अनुभवी बन जाते हैं। –

उत्तर

22

Enumerable का उपयोग कर के, ForEach() के लिए एक विस्तार की घोषणा नहीं करता। ये दोनों बाहरी संदर्भों से हैं।

आपको केवल उनमें से एक का उपयोग करना चाहिए - या तो संदर्भ जो EnumerableExtensionMethods या LinqKit जोड़ रहा है।

(यह, btw, एक कारण यह है कि एक ही नाम स्थान का उपयोग कर के रूप में ढांचे समस्याओं का कारण बनता है - इस मामले में, EnumerableExtensionMethods के लेखक System.Linq में रखा है, जो एक मुद्दा किसी भी समय आप Linq का उपयोग कर रहे पैदा करने के लिए जा रहा है और आप एक नाम स्थान टकराव है)

आप वास्तव में इस विधि का उपयोग करने की आवश्यकता है, तो आप के बजाय सीधे कॉल करने के लिए होगा विस्तार विधि का उपयोग कर, अर्थात्:।

LinqKit.Extensions.ForEach(collection, action); 

या:

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

कहा जा रहा है कि, मैं व्यक्तिगत रूप से केवल तत्वों को संसाधित करने के लिए फ़ोरैच लूप का उपयोग करता हूं।

0

आपको बस उस संदेश को पूरी तरह से अर्हता प्राप्त करने की आवश्यकता है जिसे आप कॉल कर रहे हैं, जैसा कि त्रुटि संदेश में है।

तो, बजाय ढांचे में,

ForEach<Domain>(...); 

उपयोग

LinqKit.Extensions.ForEach<Domain>(...); 
संबंधित मुद्दे