2012-01-06 15 views
26

लागू करने में समस्याएं मैं सूची का अपना (सरल) कार्यान्वयन लिखने की कोशिश कर रहा हूं।IENumerable <T>

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace provaIEnum 
{ 
    class MyList<T> : IEnumerable<T> 
    { 
     private T[] _array; 
     public int Count { get; private set; } 

     public MyList() { /* ... */ } 
     public void Add(T element) { /* ... */ } 

     // ... 

     public IEnumerator<T> GetEnumerator() 
     { 
      for (int i = 0; i < Count; i++) 
       yield return _array[i]; 
     } 
    } 

मैं हालांकि GetEnumerator बारे में एक त्रुटि हो रही है:: यह मैं अब तक क्या किया है

'provaIEnum.Lista' इंटरफेस सदस्य को लागू नहीं करता है 'System.Collections.IEnumerable.GetEnumerator() '। 'provaIEnum.Lista.GetEnumerator()' 'सिस्टम को लागू नहीं कर सकता है। Collections.IEnumerable.GetEnumerator()' क्योंकि यह में 'System.Collections.IEnumerator' का मिलान करने वाला रिटर्न प्रकार नहीं है।

मुझे यकीन नहीं है कि मैं समझता हूं कि वीएस मुझे क्या बताने की कोशिश कर रहा है और मुझे नहीं पता कि इसे कैसे ठीक किया जाए।

अपने समय के लिए धन्यवाद

+0

ध्यान दें कि आपको अपने गणक को इस तरह लिखना नहीं चाहिए क्योंकि वर्तमान में आप 'फोरैच' में अपनी आंतरिक सरणी को संशोधित कर सकते हैं (फोरैच में 'एड' को कॉल करना अपवाद का कारण नहीं है)। [देखें] (http://stackoverflow.com/questions/24142614/when-should-i-separately-implement-ienumeratort) – nawfal

+0

@nawfal अच्छा बिंदु, बग हमेशा हमें देख रहे हैं;) – BlackBear

उत्तर

41

IEnumerable<T> के बाद से लागू करता IEnumerable आप अपने वर्ग जो GetEnumerator विधि के गैर जेनेरिक वर्जन है में इस इंटरफ़ेस को लागू करने के साथ-साथ की जरूरत है। टकराव से बचने के लिए आप यह स्पष्ट रूप से लागू कर सकते हैं:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    // call the generic version of the method 
    return this.GetEnumerator(); 
} 

public IEnumerator<T> GetEnumerator() 
{ 
    for (int i = 0; i < Count; i++) 
     yield return _array[i]; 
} 
+1

धन्यवाद, मुझे नहीं पता था IENumerable IENumerable लागू करता है (हालांकि यह स्पष्ट लगता है: पी) – BlackBear

+5

चूंकि आपने 'System.Collections.' के साथ' IEnumerator' और 'IEnumerable.GetEnumerator' को स्पष्ट रूप से योग्यता प्राप्त नहीं की है, इसलिए यदि आप 'सिस्टम का उपयोग नहीं कर रहे हैं।' , कह रहा है (बहुत अनुपयोगी) कि 'आईन्यूमेरेटर' को एक सामान्य तर्क की आवश्यकता है! – PJTraill

10

आप गैर सामान्य GetEnumerator विधि को लागू करने के रूप में अच्छी तरह की आवश्यकता होगी:, आप लागू करना

IEnumerator IEnumerable.GetEnumerator() 
{ 
    return GetEnumerator(); 
} 

के बाद से IEnumerable<T> इंटरफ़ेस IEnumerable फैली दोनों पर घोषित तरीकों।

+0

स्पष्ट इंटरफ़ेस कार्यान्वयन में 'मानक तरीका' के लिए एक एक्सेस संशोधक – Nuffin

36

त्रुटि संदेश को अधिक सावधानी से पढ़ें; यह आपको बिल्कुल बता रहा है कि आपको क्या करना चाहिए। आपने System.Collections.IEnumerable.GetEnumerator लागू नहीं किया था।

जब आप सामान्यIEnumerable<T> आप भी System.Collections.IEnumerable के GetEnumerator लागू करना लागू।

ऐसा करने के लिए मानक तरीका है:

public IEnumerator<T> GetEnumerator() { whatever } 
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
{ 
    return this.GetEnumerator(); 
} 
+0

+1 नहीं होना चाहिए, हर दिन सीखना जारी रखें :) – BlackBear

4

निम्नलिखित विधि जोड़ें:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    return this.GetEnumerator(); 
} 
2

GetEnumerator() के दो भार के है कि आप को लागू करना चाहिए रहे हैं। एक IEnumerable<T> से आता है और IEnumerator<T> देता है। दूसरा IENumerable से आता है और IEnumerator देता है। ओवरराइड इस तरह दिखना चाहिए:

IEnumerator IEnumerable.GetEnumerator()

इसका कारण यह है IEnumerable<T> लागू करता IEnumerable

IEnumerator<T> IEnumerable<T>.GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

यह करने के लिए एक आसान तरीका है जब आप अपने वर्ग की घोषणा:

1

अपनी कक्षा के बाद से, MyList<T> विरासत IEnumerable<out T> जो बदले में गैर सामान्य IEnumerable विरासत में, आप दो तरीकों आप को लागू करने की जरूरत है:

class MyList<T> : IEnumerable<T> 

सही IEnumerable<T> पाठ क्लिक करें और लागू इंटरफ़ेस का चयन करें> explictly इंटरफ़ेस को लागू संदर्भ मेनू से

0

मुझे इसी तरह की समस्या मिली, हालांकि मैंने आईन्यूमेरेबल और आईनेमरेबल भी लागू किया। मैं जेनेरिक प्रकार टी की तुलना में कस्टम प्रकार (व्यक्ति वर्ग) का उपयोग कर रहा था मेरे लिए कारण था, नामस्थान फ़ाइल के शीर्ष में शामिल नहीं किया गया था।

using System.Collections; 

नामस्थान जोड़ने के बाद यह मेरे लिए ठीक था।

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