2015-06-24 5 views
7

मान लें हम कोड निम्नलिखित है:क्यों नल प्रोपेगेशन ऑपरेटर का उपयोग करते समय सी # 6.0 गैर-शून्य नलिकात्मक संरचना के गुण सेट करने की अनुमति नहीं देता है?

struct Article 
{ 
    public string Prop1 { get; set; } 
} 

Article? art = new Article(); 
art?.Prop1 = "Hi"; // compile-error 

संकलन त्रुटि

CS0131 एक काम के बाएं हाथ की ओर है एक चर, संपत्ति या इंडेक्सर होना चाहिए।

असल में art?.Prop1 एक संपत्ति है और इसे वैध असाइनमेंट के रूप में माना जाना चाहिए!
मुझे इस कोड को अमान्य बनाने के लिए असाइनमेंट के साथ कोई समस्या नहीं दिखाई दे रही है।

क्यों सी # 6.0 गैर-शून्य नलिका संरचना के गुण सेट करने की अनुमति नहीं देता है?
वैकल्पिक रूप से असाइनमेंट वैध बनाने के लिए एक लाइन कोड के लिए कोई भी सुझाव सराहना की जाएगी।

+0

निकालें आपकी रेखा 'कला में प्रश्न चिह्न? .Prop1 = "हाय";' और आपके असाइनमेंट को कोई त्रुटि नहीं डालना चाहिए। इसे 'art.Prop1 = "हाय" बनाएं; ' –

+0

@ के। एलनबेट्स वह विशेष रूप से शून्य प्रचार ऑपरेटर का उपयोग करना चाहता है। – Servy

+0

स्ट्रक्चर सी # में हैं जो आपको जीवन को दिलचस्प बनाने के लिए हैं। 'सूची

लेख = नई सूची
{नया आलेख()} आज़माएं; लेख [0] .Prop1 = "test"; '- हो सकता है कि आप उस बिंदु पर structs का उपयोग करके पुनर्विचार करेंगे :)। –

उत्तर

16

इस कोड:

Article? art 

परिभाषित करेगा एक Nullable<Article> लेकिन बाद में जब आप कार्य करें:

art?.Prop1 = "Hi"; 

इस अशक्त प्रचार/सशर्त ऑपरेटर का उपयोग का मतलब होगा।

शून्य प्रचार/सशर्त ऑपरेटर गुणों तक पहुंचने के लिए है, उन्हें सेट नहीं कर रहा है। इसलिए आप इसका उपयोग नहीं कर सकते हैं।

जैसा कि @ सर्वी ने टिप्पणियों में कहा था, नल सशर्त ऑपरेटर का परिणाम हमेशा एक मान है और आप किसी मान को मान निर्दिष्ट नहीं कर सकते हैं, इसलिए त्रुटि।

आप उसके बाद ही गुण सेट करने की कोशिश कर रहे हैं, तो आप वस्तु नाम के साथ ? जरूरत नहीं है, ?Nullable<T> साथ प्रकार घोषणा के समय है, जो करने के लिए वाक्यात्मक चीनी है पर प्रयोग किया जाता है:

Nullable<Article> art; //same as Article? art 
+3

या एक ही चीज़ को अधिक तकनीकी रूप से कहने के लिए, नल प्रोपेगेशन ऑपरेटर का नतीजा हमेशा एक मान होता है, कभी भी एक चर नहीं, यही कारण है कि उसे यह त्रुटि मिल रही है कि वह किसी मान को मान निर्दिष्ट नहीं कर सकता है, क्योंकि यह एक नहीं है चर। – Servy

+3

सवाल यह है कि इसकी अनुमति क्यों नहीं है। कंपाइलर नोटिस कर सकता है कि यह एक असाइनमेंट है और फिर मूल्य के बदले चर/संपत्ति को वापस करने के लिए शून्य प्रचार ऑपरेटर का उपयोग करें या क्या मैंने कुछ अनदेखा किया? असाइनमेंट करने से पहले शून्य जांच को छोड़कर कोड को सरल बनाने के लिए इस्तेमाल किया जा सकता है। –

+1

चूंकि आप पहले से ही एक विधि जैसे कॉल कर सकते हैं? .SetValue (...), एक संपत्ति असाइनमेंट (जो एक ही बात है) एक मान्य विकल्प होना चाहिए। क्यों नहीं? – Vlad

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