मैं हाल ही में सी # मूल बातें के बारे में मेरी स्मृति को ताज़ा करने का निर्णय लिया है, तो यह तुच्छ हो सकता है, लेकिन मैं निम्न समस्या से टकरा गया है:सी # सहप्रसरण और contravariance लागू करते समय इंटरफेस
StringCollection
नेट v1 में उपयोग किया गया आदेश स्ट्रिंग के रूप में एक object
आधारित ArrayList
करने का विरोध के लिए एक जोरदार टाइप किया संग्रह बनाने के लिए में .0 (यह बाद में जेनेरिक संग्रह सहित द्वारा बढ़ाया गया था):
StringCollection
परिभाषा पर एक नज़र ले रहा है, तो आपको निम्न देख सकते हैं:
// Summary:
// Represents a collection of strings.
[Serializable]
public class StringCollection : IList, ICollection, IEnumerable
{
...
public int Add(string value);
...
}
आप देख सकते हैं यह लागू करता IList
है, जो निम्नलिखित घोषणा (कुछ अन्य घोषणाओं के बीच) शामिल हैं:
int Add(object value);
लेकिन नहीं:
int Add(string value);
मेरी पहली धारणा है कि यह कारण संभव है था .NET ढांचे covariance नियम।
तो बस सुनिश्चित करने के लिए, मैं अपने ही वर्ग जो IList
लागू करता है लेखन की कोशिश की और
int Add(object value);
बदल एक स्ट्रिंग एक वस्तु लिखने के बजाय टाइप पुनः प्राप्त करने के लिए, लेकिन मेरे आश्चर्य के लिए, जब परियोजना को संकलित करने की कोशिश कर रहा , मुझे एक संकलन-समय त्रुटि मिली:
does not implement interface member 'System.Collections.IList.Add(object)'
कोई विचार क्या कारण है?
धन्यवाद!
तो मुझे याद रखना चाहिए कि एक इंटरफेस के अंगूठे के स्पष्ट कार्यान्वयन के नियम के रूप में कक्षा परिभाषाओं में निर्मित .NET पुस्तकालयों में दिखाई नहीं देता है? (क्योंकि मैं स्पष्ट रूप से स्ट्रिंगकोलेक्शन क्लास में सभी विधियों के बीच इस कार्यान्वयन को नहीं देख सकता) कोई कारण क्यों? –
आम तौर पर, सदस्य छाया के समान प्रभाव में - मैंने इसे संबोधित करने के लिए प्रतिक्रिया में संशोधन किया। – drf