2015-10-09 3 views
6

मैं डैप्पर का उपयोग कर और यह एक गतिशील IEnumerable लौटने के लिए, इस तरह हो रही थी:गतिशील IENumerable प्रतीक्षा करने योग्य पर पहला() या ElementAt() क्यों है?

var rows = conn.Query("SELECT * FROM T WHERE ID = @id", new { id = tableId }); 
var row = rows.FirstOrDefault(); 

यहाँ, rows प्रकार IEnumerable<dynamic> की है। IntelliSense का कहना है FirstOrDefault() प्रतीक्षा योग्य है, और इसका उपयोग await FirstOrDefault() है। सभी LINQ प्रश्नों को प्रतीक्षा करने योग्य नहीं दिखाया जाता है, लेकिन ऐसा लगता है कि विशेष रूप से वे जो किसी भी तरह से एकल तत्व हैं।

जैसे ही मैं मजबूत टाइपिंग का उपयोग करता हूं, यह व्यवहार दूर हो जाता है।

ऐसा इसलिए है क्योंकि .NET को पता नहीं चल सकता कि आप रनटाइम पर जो प्रकार प्राप्त कर रहे हैं वह प्रतीक्षा योग्य है या नहीं, ताकि अगर आपको इसकी आवश्यकता हो तो यह "अनुमति देता है"? लेकिन इसे लागू नहीं करता है? या मुझे लगता है कि, कुछ गतिशील भाषा रनटाइम व्यवहार के कारण, वास्तव में await का उपयोग करें?

मैंने खोज रखा है लेकिन इस ऑनलाइन के बारे में सबसे छोटी चीज़ नहीं मिली है।

+0

आप गतिशील वापसी से प्रतीक्षा कर सकते हैं। मुझे लगता है कि अगर कोई कार्य नहीं है तो यह अपवाद फेंक देगा। संपादित करें: मैंने इसका परीक्षण किया है। यदि गतिशील कार्य या कार्य नहीं है तो यह अपवाद फेंक देगा। –

+6

आप 'गतिशील' पर 'GetAwaiter() 'को कॉल कर सकते हैं, इसलिए हाँ यह प्रतीक्षा योग्य है। – PetSerAl

उत्तर

8

async-await कंपाइलर की सुविधा Duck Typing पर निर्भर करती है। तो सब कुछ विधि GetAwaiter (या तो उदाहरण या विस्तार विधि) जो प्रकार है कि INotifyCompletion इंटरफ़ेस लागू करता है और अगले फ़ील्ड होते हैं देता है:

  • bool IsCompleted { get; }
  • void|TResult GetResult()

प्रतीक्षित जा सकता है।

आप कॉल कर सकते हैं जो कुछ भी आप संकलन समय पर (docs से) गतिशील प्रकार पर हैं:

संकलन समय, एक तत्व के रूप में गतिशील किसी भी कार्रवाई का समर्थन करने के लिए माना जाता है लिखा गया हो।

है यही कारण है कि संकलक संकलन समय पर कोई चेतावनी/त्रुटियों प्रदर्शित नहीं करता है, लेकिन क्रम में आप एक अपवाद निम्न के समान हो जाएगा:

RuntimeBinderException।

'<> f__AnonymousType0' के लिए एक परिभाषा शामिल नहीं है 'GetAwaiter'

आप टाइप स्पष्ट रूप से संकलक विधि GetAwaiter के लिए खोज करेंगे निर्दिष्ट करते हैं। फिर यदि आपके मजबूत प्रकार में यह शामिल नहीं है तो आपको संकलन समय त्रुटि मिल जाएगी।

तो, आपके सवाल का जवाब है कि वास्तव में उस dynamic की विशेष व्यवहार के कारण है।

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