मुझे लगता है कि आपको dynamic
का अर्थ गलत है। अनिवार्य रूप से, जब आप कंपाइलर को बताते हैं कि ऑब्जेक्ट का प्रकार dynamic
है, तो आप "वादा" करते हैं कि ऑब्जेक्ट रनटाइम पर आपके द्वारा जो भी तरीकों या गुणों का उपयोग किया जाता है, वह संकलन के बदले संकलित समय पर शिकायत नहीं करेगा। आप यह भी वादा करते हैं कि यदि आप अपना वादा तोड़ते हैं तो आप परिणामों का सामना करेंगे।
जब आप का कहना है कि एक वस्तु dynamic
है, संकलक प्रकार के बारे में मान्यताओं नहीं कर सकते हैं, तो यह object
का उपयोग करता है, जानते हुए भी कि कुछ भी object
के रूप में जमा किया जा सकता है। जब आप एक IEnumerable<dynamic>
बनाने के लिए, यह IEnumerable<object>
हो जाता है, एक महत्वपूर्ण अंतर के साथ: यदि आप अपने तत्वों पर किसी भी विधि कॉल कर सकते हैं, और संकलक एक शब्द कहना नहीं होगा:
IEnumerable<SomeType> original = ...
foreach (dynamic x in original.AsDynamic()) { // Using your method
Console.WriteLine(x.SomeUnsupportedMethod()); // The compiler is silent!
}
original.AsDynamic()
के बाद से dynamic
वस्तुओं की एक अनुक्रम देता है, कंपाइलर आपके कॉल के बारे में SomeUnsupportedMethod
पर शिकायत नहीं करता है।यदि विधि वास्तव में रनटाइम पर समर्थित नहीं है, तो प्रोग्राम क्रैश हो जाएगा; यदि विधि वास्तव में SomeType
के तत्वों द्वारा समर्थित है, तो कोई क्रैश नहीं होगा, और विधि लागू की जाएगी।
यह सब dynamic
आपके लिए करेगा; सांख्यिकीय रूप से, "प्लेसहोल्डर" object
रहेगा, और typeof
आपको उतना ही बताएगा। लेकिन ऑब्जेक्ट (इसकी विधियों और गुणों) की सटीक क्षमताओं को रनटाइम तक जांच नहीं की जाएगी।
["ज्यादातर मामलों में, यह इस तरह की कार्य करता है जैसे कि टाइप ऑब्जेक्ट है।"] (Http://msdn.microsoft.com/en-us/library/dd264736.aspx) –
रनटाइम पर कोई 'गतिशील' प्रकार नहीं है , वे केवल ऑब्जेक्ट के रूप में टाइप किए गए हैं और विधि बाध्यकारी जानकारी गतिशील चर शामिल प्रत्येक कॉल साइट पर आउटपुट है। – Lee