इस मुद्दे का क्या कारण है?
मेरे लिए एक कंपाइलर बग जैसा दिखता है। कम से कम, यह किया था। यद्यपि समय 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
पैरामीटर के माध्यम से असाइन करने के बाद उपयोग करता है ।