2010-05-05 14 views
35

मैं अपने खुद के ArrayList वर्ग को लागू किया गया था और जब मुझे एहसास हुआ कि.NET में सरणी केवल IENumerable को लागू क्यों करती हैं और IENumerable <T> नहीं?

public System.Collections.Generic.IEnumerator<T> GetEnumerator() { 
    return _array.GetEnumerator(); 
} 

काम नहीं किया हैरान रह गया। IEET में IENumerator को लागू नहीं करने का कारण क्या है?

क्या कोई काम-आसपास है?

धन्यवाद

+4

जब आप पहले से ही एक दर्जन से अधिक मौजूदा संग्रह कक्षाएं हैं तो आप अपनी खुद की ऐरेलिस्ट सूची क्यों लागू करेंगे? – Aaronaught

+52

मैं क्यों नहीं? मैं उन तरह की टिप्पणियों से थक गया हूँ। –

+4

हम आपको इस तरह के प्रश्नों से परेशान करने के लिए नहीं कहते हैं, लेकिन यह पता लगाने के लिए कि आप क्या कर रहे हैं। इससे हमें आपको बेहतर उत्तर देने में मदद मिलती है। – Steven

उत्तर

49

सरणी IEnumerable<T> को लागू करते हैं, लेकिन यह विशेष ज्ञान CLI सरणियों के लिए है के भाग के रूप में किया जाता है। कई टूल इस कार्यान्वयन को नहीं दिखाएंगे। documentation (पहले .NET संस्करणों के लिए प्रलेखन: "महत्वपूर्ण" ब्लॉक के लिए दस्तावेज़) में ".NET Framework 2.0 से शुरू होने वाली टिप्पणियों" से शुरू होने वाली टिप्पणियों में अनुच्छेद देखें।

तुम एक डाली जोड़ सकते हैं:

return ((IEnumerable<T>)_array).GetEnumerator(); 
+0

यह एक _explicit इंटरफ़ेस कार्यान्वयन_ द्वारा "वर्ग" 'टी []' लागू 'IEnumerable ' के रूप में कार्य करता है। यदि आप बस '_array.GetEnumerator()' कहें तो आपको 'सार्वजनिक' विधि मिलती है जिसमें गलत रिटर्न प्रकार होता है। –

+0

@RayL प्रलेखन के .NET 2.0 संस्करण को देखें :-) अद्यतन। – Richard

+0

बस एक सिर ऊपर। संदर्भित https://msdn.microsoft.com/en-us/library/system.array.aspx#Remarks से: यह 'IList ', 'ICollection ' और 'IEnumerable 'जेनेरिक इंटरफेस लागू करता है। – Wouter

-1

आप System.Linq नाम स्थान है, जो IEnumerable इंटरफ़ेस फैली से सामान्य विधि IEnumerable<T> OfType<T>() उपयोग कर सकते हैं। यह सभी तत्वों को फ़िल्टर करेगा जो टाइप टी से अलग हैं और IEnumerable<T> collection लौटाएं। यदि आप (IEnumerable<T>)_array रूपांतरण ऑपरेटर का उपयोग करते हैं, तो यह सुरक्षित नहीं हो सकता है, क्योंकि System.Array (और अन्य गैर-सामान्य प्रकार) System.Object प्रकार के आइटम संग्रहीत करते हैं।

+0

ऑब्जेक्ट्स के केवल सरणी (यानी 'ऑब्जेक्ट [] arr') आइटम को ऑब्जेक्ट के रूप में संग्रहीत करता है। उन के अलावा, सरणी प्रकार सुरक्षित हैं। इससे ऑफ टाइप और कास्ट विधियां अनावश्यक हो जाती हैं। – jmoreno

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