2014-06-12 9 views
15

मैं सी # 6 में नल-प्रोपेगेशन ऑपरेटर देख रहा हूं और इसे dynamic प्रकार के चर के साथ काम करने की कोशिश की लेकिन सफलता के बिना। नीचे दिए गए कोड पर विचार करें, यह संकलित करता है लेकिन सीएलआर रनटाइम पर AccessViolationException फेंकता है जब शून्य-प्रसार गतिशील वस्तु पर लागू होता है।नल प्रोपेगेशन ऑपरेटर और डायनामिक वेरिएबल

class SomeType 
{ 
    public object SomeProperty { get; set; } 

    static void Main() 
    { 
     var obj = new SomeType() { SomeProperty = "ABCD" }; 

     var p1 = ((dynamic)obj).SomeProperty; //OK, p1 is set to "ABCD" 
     var p2 = ((dynamic)obj)?.SomeProperty; //AccessViolationException 

     Console.ReadLine(); 
    } 
} 

पहले तो मैंने सोचा था कि यह एक बग हो सकता है, लेकिन फिर मैंने सोचा कि struct बारे में है। आम तौर पर आप ?. ऑपरेटर को वैल्यू टाइप वैरिएबल पर लागू नहीं कर सकते हैं (क्योंकि यह शून्य नहीं हो सकता है)। लेकिन आप इसे dynamic पर डाल सकते हैं और फिर ऑपरेटर को लागू कर सकते हैं। इसलिए मैंने SomeType को struct में बदल दिया और उसी अपवाद को मिला।

सवाल यह है कि, यह डिज़ाइन द्वारा है कि गतिशील चर के लिए शून्य-प्रसार हमेशा अपवाद फेंकने जा रहा है क्योंकि अंतर्निहित वस्तु मूल्य प्रकार हो सकती है?

AccessViolationException वैसे भी बदसूरत है, क्या आप कोड चलाते समय वही प्राप्त करते हैं?

+0

अंधेरे में बस एक स्टैब: क्या होता है यदि आप 'आंतरिक' के बजाय 'कुछ टाइप' 'सार्वजनिक 'करते हैं? –

+0

@ChrisSinclair आउटपुट एक ही – nosalan

+3

है यदि आप अपने exe के खिलाफ 'PEVerify.exe' चलाते हैं, तो क्या यह किसी भी त्रुटि की रिपोर्ट करता है? – latkin

उत्तर

3

AccessViolationException लगभग हमेशा एक कंपाइलर बग या एक खराब गठित PInvoke कॉल है।

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