2012-08-26 20 views
5

संभव डुप्लिकेट:
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) कहता है, तो वह एक अलग परिणाम प्राप्त करेगा, भले ही शरीर पहली नज़र में काफी समान दिखता हो।

मजेदार बात यह है कि किसी भी मामले में कंपाइलर या रनटाइम अस्पष्टता का पता नहीं लगाता है और त्रुटि देता है।
इसके बजाए, रनटाइम सिर्फ इस व्यवहार के संबंध में बदलता है कि मूल्य सामान्य है या नहीं, जो कॉलर के लिए स्पष्ट रूप से अप्रत्याशित हो सकता है।

क्यों व्यवहार असंगत है?
या, बेहतर अभी तक, अस्पष्टता के कारण कोई कंपाइलर (या रनटाइम) त्रुटि क्यों नहीं है?

+0

@SergRogovtsev: वाह, अच्छा लगता है! वह नहीं देखा; ऐसा पूरी तरह से जवाब देने लगता है।हमें तब अपना प्रश्न बंद करने के लिए वोट देना चाहिए। – Mehrdad

उत्तर

0

क्यों हैक आपको लगता है कि यह असंगत व्यवहार है? यह सिर्फ बिंदु है, कि आप "शायद-कुंजी"-प्रकार गेटटर के साथ इंडेक्स-गेटर को ओवरराइड करते हैं ...

आपको क्या लगता है, अपेक्षित परिणाम होना चाहिए? चेतावनी? यह डेवलपर की आवश्यकता है कि आप किस प्रकार के जेनिक्स के लिए उपयोग करना चाहते हैं ... यह जांचने के लिए पर्याप्त बुद्धिमान है कि विधि "test1" कुंजी-आधारित गेटर और test2 केवल इंडेक्स-आधारित गेटर को संबोधित करेगी ...

आप या तो अस्वीकार प्रकार के रूप में "पूर्णांक" (उदाहरण के लिए वर्ग-बाधा के साथ) के लिए है या एक अन्य गेटर-विधि यहाँ लागू ...

0

क्योंकि संकलक चीजों के बारे में चेतावनी या त्रुटियों बाहर फोन नहीं है कि यह संदिग्ध आप के लिए अस्पष्ट दिखाई दे सकता है। यह उन चीजों को बुलाता है जो इसे अस्पष्ट लगते हैं। लेकिन यहां कंपाइलर के लिए संदिग्ध कुछ भी नहीं है।

मान लें कि मैं आपको वर्गों और आयताकारों को सौंपता हूं और आपको वर्गों को ढेर में और आयत को ढेर में डाल देता हूं। इसके अलावा, आपको यह देखने के लिए ऑब्जेक्ट्स को देखने की ज़रूरत नहीं है कि वे वर्ग या आयताकार हैं क्योंकि वे पहले से ही लेबल किए गए हैं। अब ... किसी बिंदु पर मैं आपको एक ऑब्जेक्ट सौंपता हूं जिसे आयताकार के रूप में चिह्नित किया जाता है लेकिन आप देखते हैं कि यह एक वर्ग भी होता है। अब, मैंने आपको वस्तुओं का विश्लेषण करने के लिए नहीं बताया ... मैंने आपको निर्देशों का पालन करने और उन्हें लेबल करने के तरीके के अनुसार व्यवस्थित करने के लिए कहा था। और इस तरह संकलक काम करता है ... ठीक वही कर रहा है जो आप इसे करने के लिए कहते हैं।

+0

निश्चित है, लेकिन रनटाइम त्रुटि नहीं दे सकता है? यह असंगत व्यवहार देने से बेहतर प्रतीत होता है। – Mehrdad

+0

कई लोग बहस करते हैं (इतने सारे शब्दों में) कि तथ्य यह है कि एक कंपाइलर कुछ निश्चित तरीके से यह मतलब है कि यह सही है। मैं आमतौर पर उस तर्क से असहमत हूं। हालांकि यह मामला अलग है क्योंकि आप कहते हैं कि व्यवहार असंगत है, लेकिन साथ ही आपने यह भी बताया कि यह * आईएस * सुसंगत है जब आपने कहा कि यह मान सामान्य है या नहीं, इस पर आधारित है। तो वास्तव में यहाँ असंगत कौन है? : पी –

+0

हू? जेनेरिक गैर-जेनेरिक से अलग व्यवहार देते हैं, भले ही प्रकार के विकल्प समान हैं। मैं उस असंगत कहता हूं। – Mehrdad

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^