तो मैंने Eric Lippert's 'Constraints are not part of the signature' पढ़ा, और अब मैं समझता हूं कि स्पेक निर्दिष्ट करता है कि ओवरलोड रिज़ॉल्यूशन के बाद उस प्रकार की बाधाओं की जांच की जाती है, लेकिन मुझे अभी भी यह स्पष्ट नहीं है कि यह मामला क्यों होना चाहिए। नीचे एरिक के उदाहरण है:विधि हस्ताक्षर का बाधा हिस्सा क्यों नहीं हैं?
यह संकलन नहीं करता है के लिए अधिभार संकल्प है क्योंकि: Foo(new Giraffe())
infers कि Foo<Giraffe>
सबसे अच्छा अधिभार मुकाबला नहीं है लेकिन फिर प्रकार की कमी असफल और एक संकलन समय त्रुटि फेंक दिया है। एरिक के शब्दों में:
सिद्धांत यहां अधिभार संकल्प (और विधि प्रकार अनुमान) तर्कों की सूची और औपचारिक मानकों की प्रत्येक उम्मीदवार विधि की सूची के बीच सबसे अच्छा संभव मिलान ढूंढता है। यही है, वे उम्मीदवार विधि के हस्ताक्षर को देखते हैं।
टाइप बाधाएं हस्ताक्षर का हिस्सा नहीं हैं, लेकिन वे क्यों नहीं हो सकते हैं? कुछ परिदृश्य क्या हैं जहां हस्ताक्षर के प्रकार की बाधाओं पर विचार करना बुरा विचार है? क्या यह कार्यान्वित करना मुश्किल या असंभव है? मैं वकालत नहीं कर रहा हूं कि यदि सबसे अच्छा चुने गए ओवरलोड को कॉल करने के लिए असंभव कारण है तो चुपचाप दूसरे सर्वश्रेष्ठ पर फॉलबैक; मैं उससे नफरत करता हूं। मैं बस यह समझने की कोशिश कर रहा हूं कि सर्वश्रेष्ठ अधिभार के चयन को प्रभावित करने के लिए टाइप बाधाओं का उपयोग क्यों नहीं किया जा सकता है।
मैं कल्पना कर रहा है कि आंतरिक रूप से सी # संकलक में, अधिभार संकल्प प्रयोजनों के लिए ही (यह स्थायी रूप से विधि पुनर्लेखन नहीं करता है), निम्नलिखित:
:static void Foo<T>(T t) where T : Reptile { }
में तब्दील हो जाता है
static void Foo(Reptile t) { }
आप औपचारिक पैरामीटर सूची में प्रकार की बाधाओं को "खींचें" क्यों नहीं कर सकते? यह किसी भी बुरे तरीके से हस्ताक्षर कैसे बदलता है? मुझे लगता है कि यह केवल हस्ताक्षर को मजबूत करता है। फिर Foo<Reptile>
कभी अधिभार उम्मीदवार के रूप में नहीं माना जाएगा।
संपादित करें 2: कोई आश्चर्य नहीं कि मेरा प्रश्न इतना भ्रमित था। मैंने एरिक के ब्लॉग को ठीक से नहीं पढ़ा और मैंने गलत उदाहरण उद्धृत किया। मैंने उदाहरण में संपादित किया है जो मुझे लगता है कि अधिक उपयुक्त है। मैंने शीर्षक को और अधिक विशिष्ट होने के लिए भी बदल दिया है। यह सवाल उतना आसान नहीं लगता जितना मैंने पहली बार कल्पना की थी, शायद मुझे कुछ महत्वपूर्ण अवधारणा याद आ रही है। मुझे कम यकीन है कि यह स्टैक ओवरफ्लो सामग्री है, इस प्रश्न/चर्चा को कहीं और स्थानांतरित करने के लिए यह सबसे अच्छा हो सकता है।
आपके प्रश्न के शीर्ष पर उद्धृत इगुआनास के बारे में थोड़ा सा उद्देश्य ऐसी परिस्थिति को चित्रित करना था जहां टाइप धारणा * खाते में बाधा डालती है, अर्थात् टी में टी पर बाधा, और इसलिए ओवरलोड रिज़ॉल्यूशन अंततः चुनता है इस उदाहरण में * गैर सामान्य * विधि। क्या आप निश्चित रूप से इस आलेख से पूछने के लिए उद्धृत करने का इरादा रखते हैं कि लेख का प्रासंगिक बिट है? प्रश्न का शेष तार्किक रूप से इसका पालन नहीं करता है। –
मुझे लगता है कि आप यह पूछने का इरादा रखते हैं कि ऐसा क्यों है कि जब टाइप अनुमान * सफल होता है * लेकिन एक प्रकार का अनुमान लगाता है जो विधि प्रकार पैरामीटर * पर बाधा का उल्लंघन करता है, तो विकल्प होने पर ओवरलोड रिज़ॉल्यूशन विफल क्यों होता है। मुझे यह सवाल बहुत भ्रमित कर रहा है, लेकिन फिर, यह विनिर्देश का एक भ्रमित हिस्सा है। –
आप सही हैं। मैंने आपके ब्लॉग को गलत तरीके से पढ़ा और गलत उदाहरण का इस्तेमाल किया। कोई आश्चर्य नहीं कि मेरा सवाल इतना उलझन में था। मैंने अपने प्रश्न को जितना संभव हो उतना स्पष्ट करने की कोशिश की है; मैं यह देखने के लिए कि क्या मैं इस विषय पर अपनी समझ में सुधार कर सकता हूं, मैं आपके कुछ अन्य ब्लॉग पोस्टों के माध्यम से भी पढ़ रहा हूं। – Daryl