2015-11-06 7 views
5

मैं एक dynamic तर्क के साथ IEnumerable.Contains() कॉल करने के लिए कोशिश कर रहा हूँ, लेकिन मैं त्रुटि हो रही हैInumerable.Contains() को कॉल करते समय मुझे गतिशील ऑब्जेक्ट डालने की आवश्यकता क्यों है?

'IEnumerable' 'शामिल' के लिए एक परिभाषा और सबसे अच्छा विस्तार विधि अधिभार 'Queryable.Contains IQueryable शामिल नहीं है (, टीएसओआरएस) 'में कुछ अमान्य तर्क

मैंने देखा है कि मैं या तो सही प्रकार के लिए तर्क डाल सकता हूं, या समस्या को ठीक करने के लिए अंतर्निहित संग्रह प्रकार का उपयोग कर सकता हूं। लेकिन मुझे यकीन नहीं है कि मैं सीधे तर्क में क्यों नहीं जा सकता।

dynamic d = "test"; 
var s = new HashSet<string>(); 
IEnumerable<string> ie = s; 

s.Contains(d);   // Works 
ie.Contains(d);   // Does not work 
ie.Contains((string)d); // Works 
+0

@JonSkeet अगर मैं इसे निकालने के लिए, यह मेरे vs2012 में त्रुटि फेंकता है कोई बड़ी बात नहीं है – MethodMan

+0

मैंने लिखने में गलती @JonSkeet मैं किसी भी खत्म करने के लिए टिप्पणी को हटा देगा हो सकता था भ्रम – MethodMan

+0

@ जोन्सस्केट मैंने हटा दिया है .. धन्यवाद। – MethodMan

उत्तर

5

Enumerable.Contains एक विस्तार विधि है - और विस्तार तरीकों मिनी संकलक जो निष्पादन समय पर प्रयोग किया जाता है तक इसका समाधान नहीं कर रहे हैं। (निष्पादन विधियां using निर्देशों पर निर्भर करती हैं, जिन्हें संरक्षित नहीं किया जाता है। वे हो सकते हैं, लेकिन मुझे लगता है कि यह थोड़ा दर्दनाक के रूप में देखा गया था।) इसमें dynamic दोनों का विस्तार विस्तार विधियों, और का उपयोग करके "लक्ष्य" "विस्तार तरीकों का।

बस के बजाय सीधे विस्तार विधि निर्दिष्ट करें:

var result = Enumerable.Contains(ie, d); 
+0

यह इस [ऑनलाइन कंपाइलर] पर काम करता है (https://dotnetfiddle.net/xPvF8e)। – ryanyuyu

+0

@ryanyuyu नहीं, जब आप 'b = ie.Contains (d) पर होवर करते हैं, तो यह स्क्विगली लाल रेखा में एक त्रुटि नोटिस फेंकता नहीं है;' – MethodMan

+0

@MethodMan पर क्लिक करते समय नोटिस करें कि ओपी का मूल कोड था टेढ़ा-मेढ़ा। जॉन स्कीट का समाधान एक त्रुटि उत्पन्न नहीं करता है। – ryanyuyu

संबंधित मुद्दे

 संबंधित मुद्दे