2016-01-12 8 views
5

का सम्मान नहीं करता है मैं सी # dynamic कीवर्ड के लिए काफी नया हूं। मेरी परियोजनाओं में से एक में मैंने इसके साथ खेलने की कोशिश की और कुछ अप्रत्याशित व्यवहार का सामना किया। मैं एक RuntimeBinderException कहगतिशील प्रतिक्रिया प्रकार

'System.DateTime' 'मान' के लिए एक परिभाषा शामिल नहीं है मिल

class Program 
{ 
    static DateTime? DateOnly(DateTime? time) 
    { 
     return time.HasValue ? (System.DateTime?)time.Value.Date : null; 
    } 

    static void Main(string[] args) 
    { 
     dynamic now = System.DateTime.Now; 
     var date = DateOnly(now); 
     Console.WriteLine(date.Value); // error thrown here 
     Console.Read(); 
    } 
} 

: मैं निम्नलिखित कोड के साथ स्थिति पुन: पेश करने में कामयाब रहे।

तो चर dateDateTime बजाय DateTime? माना जाता है।

ऐसा लगता है कि dynamic किसी भी प्रकार वापसी प्रकार की घोषणा को अनदेखा करता है। क्या मुझे का उपयोग dynamic के साथ करना चाहिए?

उत्तर

5

क्योंकि आप dynamic वैरिएबल को DateOnly विधि पर पास करते हैं, तो वापसी प्रकार भी गतिशील हो जाता है। तो इस मामले में, आपके var date वास्तव में dynamic date है। इसमें एक बॉक्सिंग नालीबल DateTime है, लेकिन मुक्केबाजी "शून्य" भाग को संरक्षित नहीं करती है, इसलिए वास्तव में यह केवल DateTime बॉक्स बॉक्स है, जिसमें Value प्रॉपर्टी नहीं है। इसलिए आपको मूल्य प्रिंट करने के लिए केवल Console.WriteLine(date) करना चाहिए।

आप देख सकते हैं, नल प्रकार और dynamic बहुत अच्छी तरह से एक साथ खेलते हैं नहीं है ...

0

अपने फ़ंक्शन पैरामीटर को देखें, आप एक शून्य प्रकार के लिए पूछ रहे हैं। डेटटाइम (System.DateTime.Now) एक मान प्रकार है और मान प्रकार डिफ़ॉल्ट रूप से शून्य नहीं होते हैं।

+0

@PoweredByOrange Nullable एक struct है। –

2

दो मुद्दे हैं। एक यह है कि date अभी भी गतिशील है क्योंकि दाएं हाथ की ओर एक गतिशील अभिव्यक्ति है। यदि आपने date को विशिष्ट प्रकार DateTime? के साथ घोषित किया था तो आप इसे नहीं देख पाएंगे। दूसरा मुद्दा यह है कि आप एक नामुमकिन मूल्य प्रकार लौट रहे हैं और गतिशीलता में रूपांतरण मुक्केबाजी माना जाता है। निरर्थक मान प्रकारों को कभी भी इस तरह से बॉक्स नहीं किया जाता है। अंतर्निहित मूल्य प्रकार अनचाहे है इसलिए dateobject के संदर्भ की तरह व्यवहार करता है जो कि DateTime? का संदर्भ नहीं दे सकता है, या तो डेटटाइम हो सकता है या शून्य हो सकता है। बाइंडर फिर डेटटाइम के विरुद्ध Value संपत्ति को हल करने की कोशिश करता है और विफल रहता है। यदि आप Console.WriteLine(date) आज़माते हैं, हालांकि यह संदिग्ध के रूप में विफल हो जाएगा क्योंकि उस विधि में इतने सारे अधिभार हैं। तो आपको Console.WriteLine((object)date) जैसे कुछ करना होगा, इस बिंदु पर आप date को object के रूप में घोषित कर सकते हैं।

+0

क्या आपका मतलब "दाएं हाथ की ओर" था? –

+0

@ थॉमस लेवेस्क्यू हाँ मेरा मतलब दूसरा बायां था। फिक्स्ड। –

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