क्या यह बग है?
हाँ।
बधाई हो, आपको अधिभार संकल्प में एक बग मिला है। बग सी # 4 और 5 में प्रजनन करता है; यह सिमेंटिक विश्लेषक के "रोसलिन" संस्करण में पुन: पेश नहीं करता है। मैंने C # 5 टेस्ट टीम को सूचित किया है, और उम्मीद है कि हम अंतिम रिलीज से पहले इसकी जांच और हल कर सकते हैं। (हमेशा की तरह, कोई वादा नहीं।)
एक सही विश्लेषण इस प्रकार है। उम्मीदवार हैं:
0: C(params string[]) in its normal form
1: C(params string[]) in its expanded form
2: C<string>(string)
3: C(string, object)
उम्मीदवार शून्य स्पष्ट रूप से अनुचित है क्योंकि string
यह परिवर्तनीय नहीं है string[]
। वह तीन छोड़ देता है।
तीन में से, हमें एक अद्वितीय सर्वोत्तम विधि निर्धारित करनी चाहिए। हम शेष तीन उम्मीदवारों की जोड़ी की तुलना करके बनाते हैं। ऐसी तीन जोड़ियाँ हैं। उन सभी के पास हैएक बार जब हम छोड़े गए वैकल्पिक मापदंडों को छीन लेते हैं, समान पैरामीटर सूची होती है, जिसका अर्थ है कि हमें विनिर्देश के खंड 7.5.3.2 में वर्णित उन्नत टाईब्रेकिंग दौर में जाना है।
कौन सा बेहतर है, 1 या 2? प्रासंगिक टाईब्रेकर यह है कि एक सामान्य विधि हमेशा गैर-जेनेरिक विधि से भी बदतर होती है। 2 1 से भी बदतर है। इसलिए 2 विजेता नहीं हो सकते।
कौन सा बेहतर है, 1 या 3? प्रासंगिक टाईब्रेकर है: केवल विस्तारित रूप में लागू एक विधि हमेशा अपने सामान्य रूप में लागू विधि से भी बदतर होती है। इसलिए 1 3. से भी बदतर है। इसलिए 1 विजेता नहीं हो सकता।
कौन सा बेहतर है, 2 या 3? प्रासंगिक टाईब्रेकर यह है कि एक सामान्य विधि हमेशा गैर-जेनेरिक विधि से भी बदतर होती है। 2 3 से खराब है। इसलिए 2 विजेता नहीं हो सकते।
कई लागू उम्मीदवारों के एक सेट से चुने जाने के लिए एक उम्मीदवार होना चाहिए (1) नाबाद, (2) कम से कम एक अन्य उम्मीदवार को हराए, और (3) पहले दो गुणों वाले अद्वितीय उम्मीदवार हों। उम्मीदवार तीन को किसी अन्य उम्मीदवार द्वारा नहीं पीटा जाता है, और कम से कम एक अन्य उम्मीदवार की पिटाई करता है; यह इस संपत्ति के साथ एकमात्र उम्मीदवार है। इसलिए उम्मीदवार तीन अद्वितीय सबसे अच्छा उम्मीदवार है । इसे जीतना चाहिए।
न केवल सी # 4 कंपाइलर गलत है, जैसा कि आप सही ढंग से ध्यान दें कि यह एक विचित्र त्रुटि संदेश की सूचना दे रहा है। संकलक अधिभार संकल्प विश्लेषण गलत हो रहा है थोड़ा आश्चर्य की बात है। यह त्रुटि संदेश गलत हो रहा है पूरी तरह से आश्चर्यजनक है; "अस्पष्ट विधि" त्रुटि उत्तराधिकारी मूल रूप से उम्मीदवार सेट से किसी भी दो तरीकों को चुनता है यदि सबसे अच्छा तरीका निर्धारित नहीं किया जा सकता है। "वास्तविक" अस्पष्टता खोजने में बहुत अच्छा नहीं है, अगर वास्तव में एक है।
कोई यथोचित पूछ सकता है कि ऐसा क्यों है। यह दो तरीकों को खोजने के लिए काफी मुश्किल है जो "अस्पष्ट रूप से अस्पष्ट" हैं क्योंकि "विश्वासघात" संबंध अकर्मक है । उन स्थितियों के साथ आना संभव है जहां उम्मीदवार 1 2 से बेहतर है, 2 3 से बेहतर है, और 3 1 से बेहतर है। ऐसी स्थितियों में हम उनमें से दो को "अस्पष्ट लोगों" के रूप में चुनने से बेहतर नहीं कर सकते हैं।
मैं रोजलिन के लिए इस अनुमान को सुधारना चाहूंगा लेकिन यह कम प्राथमिकता है।
(पाठक को व्यायाम: "एक रैखिक समय-एल्गोरिथ्म का पता लगाएं, एन तत्वों के एक सेट के अद्वितीय सर्वश्रेष्ठ सदस्य की पहचान करने के लिए जहां विश्वासघात संबंध अकर्मक है" इस सवाल में से एक था जो मुझे इस टीम के लिए साक्षात्कार के दिन पूछा गया था। एक बहुत ही कठिन एल्गोरिथ्म; इसे एक शॉट दें।)
जिन कारणों से हमने C # के लिए वैकल्पिक दलीलों को जोड़ने पर पीछे धकेला, उनमें से कई जटिल अस्पष्ट परिस्थितियों की संख्या थी जो इसे ओवरलोड रिज़ॉल्यूशन एल्गोरिथ्म में पेश करता है; जाहिर तौर पर हम इसे सही नहीं समझ पाए।
यदि आप इसे ट्रैक करने के लिए कनेक्ट मुद्दे को दर्ज करना चाहते हैं, तो स्वतंत्र महसूस करें। यदि आप चाहते हैं कि यह हमारे ध्यान में लाया जाए, तो इस पर विचार करें। मैं अगले साल परीक्षण के साथ पालन करेंगे।
इसे मेरे संज्ञान में लाने के लिए धन्यवाद। त्रुटि के लिए क्षमा याचना।
'Overloaded.ComplexOverloadResolution(string)'
कि<string>(string)
विधि को संदर्भित करता है ; मुझे लगता है कि यह(string, object)
विधि को संदर्भित करता है जिसमें कोई वस्तु नहीं दी जाती है।