2010-10-22 14 views
10
public string Foo(object obj) { 
    return null; 
} 

public string Foo(string str) { 
    return null; 
} 

var x = Foo((dynamic) "abc"); 

एक्स गतिशील, कंपाइलर पर्याप्त स्मार्ट क्यों नहीं है या मुझे कुछ महत्वपूर्ण याद आती है?गतिशील कॉल गतिशील परिणाम क्यों देता है?

+0

क्या होगा यदि आपके पास केवल एक 'फू' फ़ंक्शन था जो 'हैशटेबल' उपलब्ध कराता है? कंपाइलर समय से पहले नहीं जानता कि रिटर्न वैल्यू के रूप में वापस आ जाएगा। आप फ्लाई (रनटाइम पर) पर 'फू' के लिए कार्यान्वयन उत्पन्न कर सकते थे। –

+0

@ हैमिश ग्रुबिजन, जब आप 'फू' फ़ंक्शन को कॉल करते हैं, तो संकलक जानता है कि संकलन समय पर कौन सा फ़ंक्शन कॉल किया जा रहा है। इस फ़ंक्शन को स्थिर बनाने का प्रयास करें, F12 दबाएं और यह सीधे उचित फ़ंक्शन पर नेविगेट करेगा। –

+0

@ डारिन, इसे स्थैतिक क्यों बनाते हैं? –

उत्तर

4

मैं बस यहाँ अनुमान लगा रहा हूँ, लेकिन ...

जब आप dynamic करने के लिए एक वर्णक जोड़ने, पूरे अभिव्यक्ति एक गतिशील अभिव्यक्ति बन जाता है। गतिशील अभिव्यक्ति का परिणाम हमेशा dynamic होगा क्योंकि रन-टाइम पर सबकुछ हल हो जाता है।

अधिक जानकारी के लिए dynamic के प्रयोग पर बाहर MSDN पेज की जांच:

Using Type dynamic (C# Programming Guide)

और निम्न पाठ के लिए स्क्रॉल:

सबसे गतिशील आपरेशन के परिणाम ही गतिशील है।

+0

हां, लेकिन यह ठीक से संकलित करता है: 'स्ट्रिंग x = Foo ((गतिशील) "abc"); ' –

+0

रन-टाइम पर इसे हल करने की आवश्यकता क्यों है, यदि सभी विधियां स्ट्रिंग लौटती हैं? – dotneter

+0

@ डारिन - मैंने जो लिंक पोस्ट किया है उसे देखें। इसमें गतिशील वापस स्थिर प्रकारों के अंतर्निहित रूपांतरण भी शामिल हैं। इसके लिए देखो: "इसके विपरीत, एक निहित रूपांतरण गतिशील रूप से गतिशील प्रकार की किसी भी अभिव्यक्ति पर लागू किया जा सकता है।" इस मामले में, अभिव्यक्ति का नतीजा अभी भी गतिशील है लेकिन चूंकि आप x को एक स्थिर प्रकार के रूप में घोषित करते हैं, यह स्पष्ट रूप से वापस परिवर्तित हो जाता है। –

3

इस ब्लॉग पोस्टिंग आप के लिए उपयोगी हो सकता है: http://blogs.msdn.com/b/cburrows/archive/2010/04/01/errata-dynamic-conversions-and-overload-resolution.aspx

विशेष रूप से: "यदि आप एक गतिशील तर्क के साथ एक विधि कॉल है, तो यह गतिशील भेजा जाता है, अवधि।"

इसका मतलब है कि सी # यह नहीं जानता कि रनटाइम तक कौन सा अधिभार कहा जा रहा है। यह संकलन समय पर नहीं जानता है। मेरी समझ यह है कि यह भी जांचता है कि संभावित ओवरलोड संकलन समय पर क्यों हैं (यह क्यों होगा?), या इस तथ्य का ध्यान रखें कि आपके मामले में वे सभी तार वापस कर देते हैं।

तो संकलन समय पर, Foo का वापसी मूल्य ज्ञात नहीं है। इस प्रकार x का प्रकार dynamic होने के लिए संकलित समय पर निर्धारित किया गया है।

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