2017-03-12 10 views
5

का संदर्भ अर्थशास्त्र सशर्त ऑपरेटर (cond ? expr1 : expr2) के परिणामस्वरूप एक lvalue का उपयोग करने के साथ खेल रहा था।सशर्त ऑपरेटर

उदाहरण निम्नलिखित पर विचार करें

class /*(1)*/ Value { 
    public int MagicNumber { get; private set; } = 0; 
    public void Increment() { 
     /* magical code, that modifies MagicNumber */ 
    } 
} 

void Main() 
{ 
    Value v1, v2; 
    /*(2)*/ bool condition = /*...*/; 
    (condition ? v1 : v2).Increment(); // (3) 
} 

अब, मैं, शक condition के मूल्य है कि या तो v1 या v2 वृद्धि हो जाता है पर आधारित है। वास्तव में यह मामला है, जब तक Value ((1)) कक्षा है। एक बार जब मैं इसे struct को बदलने के लिए, यह मूल्य प्रकार हो जाता है और लाइन (3) (मुझे लगता है है, क्योंकि या तो v1 या v2, की नकल की वृद्धि की जाती है और त्याग दिया जाता है) कुछ नहीं करता है। इसके लिए, यह समझ में आता है। अजीब व्यवहार (2) (condition) संकलित समय पर ज्ञात होता है (उदाहरण के लिए इसे const bool परिभाषित करके)। फिर कुछ अनुकूलन खेलने के लिए आता है और v1 या v2 में से एक वास्तव में जगह में वृद्धि हुई है।

मेरा प्रश्न क्या मामला

(condition ? v1 : v2).Increment(); 
एक बार v1

और v2struct है निम्नलिखित में सशर्त ऑपरेटर की सही व्यवहार होना चाहिए, है। क्या यह वास्तव में संकलन-समय स्थिर होने पर condition पर निर्भर होना चाहिए?

+1

आप सही हैं कि जब यह एक संरचना है तो यह एक प्रति बना रहा है। यही कारण है कि उत्परिवर्तनीय structs बुराई हैं। http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil – juharr

+1

सी # कंपाइलर बहुत अनुकूलन नहीं करता है, लेकिन यह इस तरह एक कॉन्स अभिव्यक्ति से निपटता है। विचित्र व्यवहार यह है कि आप आमतौर पर "एक संरचना को म्यूट नहीं करते हैं!" सलाह एसओ पर पोस्ट की गई। वह सुंदर नहीं है, मूल्य प्रकार सी # में एक लकी अवशोषण हैं। मुझे लगता है कि आपको [नया अंक बटन] (https://github.com/dotnet/roslyn/issues) पर क्लिक करना चाहिए और माइक्रोसॉफ्ट इंजीनियरों को इस मामले पर वजन देना चाहिए। मुझे संदेह है कि वे इसे ठीक करेंगे, लेकिन कौन जानता है। –

उत्तर

1

जैसा कि सुझाव दिया गया है, मैंने माइक्रोसॉफ्ट को बग रिपोर्ट भेज दी है और यह पता चला है कि मानक स्पष्ट रूप से यह नहीं कहता है कि सशर्त ऑपरेटर का परिणाम आर-वैल्यू (वैल्यू) या एल-वैल्यू (वेरिएबल) है। मानक में अन्य चीजों की पारगमन से, ऐसा लगता है कि परिणाम should be an r-value है।

यह निर्णय लिया गया कि बग तय किया जाना चाहिए और फिक्स पहले से ही इस तरह से है।

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