संभव डुप्लिकेट:
Generic methods and method overloadingजेनिक्स के साथ अस्पष्टताएं त्रुटियों को बढ़ाने के बजाय असंगत क्यों हैं?
कहो मैं
class SortedList<K>
{
public string this[int i] { get { return "a"; /* dummy sample code */ } }
public string this[K key] { get { return "b"; /* dummy sample code */ } }
}
अब की तरह एक वर्ग है चलो कहते हैं कि कुछ दोस्त इसका इस्तेमाल करने का फैसला करता है:
static string Test1<K>(K key) { return new SortedList<K>()[key]; }
संकलक इस कॉल को K key
अधिभार पर हल करता है।
अब,
static string Test2(int key) { return new SortedList<int>()[key]; } // whoops
जहां संकलक int i
अधिभार को यह निराकरण कह के साथ इस विपरीत।
अब अगर कुछ गरीब आत्मा Test1(0)
कहती है, तो उसे Test2(0)
कहता है, तो वह एक अलग परिणाम प्राप्त करेगा, भले ही शरीर पहली नज़र में काफी समान दिखता हो।
मजेदार बात यह है कि किसी भी मामले में कंपाइलर या रनटाइम अस्पष्टता का पता नहीं लगाता है और त्रुटि देता है।
इसके बजाए, रनटाइम सिर्फ इस व्यवहार के संबंध में बदलता है कि मूल्य सामान्य है या नहीं, जो कॉलर के लिए स्पष्ट रूप से अप्रत्याशित हो सकता है।
क्यों व्यवहार असंगत है?
या, बेहतर अभी तक, अस्पष्टता के कारण कोई कंपाइलर (या रनटाइम) त्रुटि क्यों नहीं है?
@SergRogovtsev: वाह, अच्छा लगता है! वह नहीं देखा; ऐसा पूरी तरह से जवाब देने लगता है।हमें तब अपना प्रश्न बंद करने के लिए वोट देना चाहिए। – Mehrdad