इस मुद्दे का क्या कारण है?
मेरे लिए एक कंपाइलर बग जैसा दिखता है। कम से कम, यह किया था। यद्यपि समय decimal.TryParse(v, out a)और decimal.TryParse(v, out b)अभिव्यक्तियों का गतिशील रूप से मूल्यांकन किया जाता है, मुझे उम्मीद है कि कंपाइलर को अभी भी यह समझना होगा कि जब तक यह पहुंचता है a <= b, तब तक aऔर bनिश्चित रूप से दोनों को सौंपा जाता है। यहां तक कि आप अजीब टाइपिंग के साथ डायनामिक टाइपिंग में आ सकते हैं, मुझे उम्मीद है कि a <= bदोनों TryParseकॉल्स का मूल्यांकन करने के बाद ही आप कभी भी मूल्यांकन करेंगे ।
हालांकि, यह पता चला है कि ऑपरेटर और रूपांतरण ट्रिकी के माध्यम से, यह अभिव्यक्ति के लिए पूरी तरह से संभव है A && B && Cजो मूल्यांकन करता है Aऔर Cनहीं B- लेकिन यदि आप पर्याप्त चालाक हैं। नील गैटर के सरल उदाहरण के लिए रोसलिन बग रिपोर्ट देखें ।
उस कार्य को dynamicकरना और भी कठिन होता है - जब ऑपरेंड गतिशील होते हैं तो इसमें शामिल शब्दार्थ का वर्णन करना कठिन होता है, क्योंकि ओवरलोड रिज़ॉल्यूशन करने के लिए, आपको यह जानने के लिए ऑपरेंड का मूल्यांकन करना होगा कि कौन-कौन से प्रकार शामिल हैं, जो प्रति-सहज हो सकते हैं। हालांकि, फिर से नील एक उदाहरण के साथ आया है जो दिखाता है कि संकलक त्रुटि की आवश्यकता है ... यह एक बग नहीं है, यह एक बग फिक्स है । इसे साबित करने के लिए नील को भारी मात्रा में कुदोस।
क्या संकलक सेटिंग्स के माध्यम से इसे ठीक करना संभव है?
नहीं, लेकिन ऐसे विकल्प हैं जो त्रुटि से बचते हैं।
सबसे पहले, आपको यह गतिशील होने से रोक सकता है - यदि आप जानते हैं कि आप केवल कभी तार का उपयोग करेंगे, तो आप इस्तेमाल कर सकते हैं IEnumerable<string> या सीमा चर देने vका एक प्रकार है string(यानी from string v in array)। यह मेरा पसंदीदा विकल्प होगा।
यदि आपको वास्तव में इसे गतिशील रखने की आवश्यकता है, तो बस इसके bसाथ शुरू करने के लिए एक मूल्य दें :
decimal a, b = 0m;
यह कोई नुकसान नहीं पहुंचाएगा - हम जानते हैं कि वास्तव में आपका गतिशील मूल्यांकन कुछ भी पागल नहीं करेगा, इसलिए आप अभी भी bइसका उपयोग करने से पहले एक मूल्य असाइन करना शुरू कर देंगे , जिससे प्रारंभिक मूल्य अप्रासंगिक हो जाएगा।
इसके अतिरिक्त, ऐसा लगता है कि कोष्ठक जोड़ना भी काम करता है:
where decimal.TryParse(v, out a) && (decimal.TryParse("15", out b) && a <= b)
यह उस बिंदु को बदल देता है जिस पर ओवरलोड रिज़ॉल्यूशन के विभिन्न टुकड़े ट्रिगर होते हैं, और कंपाइलर को खुश करने के लिए होता है।
नहीं है एक समस्या अभी भी शेष - साथ निश्चित काम पर कल्पना के नियमों &&ऑपरेटर की जरूरत राज्य के लिए स्पष्ट किया है कि वे केवल जब लागू &&ऑपरेटर दो के साथ अपने "नियमित" कार्यान्वयन में किया जा रहा है boolऑपरेंड। मैं यह सुनिश्चित करने की कोशिश करूंगा कि यह अगले ECMA मानक के लिए तय हो।
bएकoutपैरामीटर के माध्यम से असाइन करने के बाद उपयोग करता है ।