2011-01-14 10 views
6

मूल रूप से मान लें कि आपके पास कुछ संग्रह है:क्या IENumerator.GetEnumerator() में IENumerator <T> .GetEnumerator() को वापस करना ठीक है?

public class FurCollection : IEnumerable<FurStrand> 
{ 
    public IEnumerator<FurStrand> GetEnumerator() 
    { 
     foreach(var strand in this.Strands) 
     { 
     yield return strand; 
     } 
    } 

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

क्या यह स्वीकार्य है? या यह बग प्रवण या बुरी आदत है? मैं हमेशा IEnumerator<T का उपयोग कर रहा हूं> लेकिन मैं अभी भी गैर-जेनेरिक संस्करण स्थिर और उचित रूप से कार्यान्वित करना चाहता हूं।

+0

मुझे यकीन है कि आपका मतलब है ** IENumerable ** इसके बजाय ** आईन्यूमेरेटर ** ... –

+0

धन्यवाद क्षमा करें मैंने इस नमूना को जल्दी लिखा था। –

उत्तर

10

यह पूरी तरह से मानक है और डीआरवाई और अन्य चिंताओं का अनुपालन करने की अनुशंसा की जाती है।

ध्यान दें कि

return strand; 

yield return strand; 

साथ ही होना चाहिए, यह this.Strands तरह लग रहा है पहले से ही लागू करता IEnumerable<FurStrand> ताकि आप केवल कह सकते हैं

return this.Strands.GetEnumerator(); 
+1

मैं सहमत हूं, अच्छा अभ्यास –

+0

धन्यवाद आदमी, क्षमा करें मैंने अभी यह नमूना बनाया है, इसलिए उपज भूल गई। –

+0

@ डाउनवॉटर: आपको वास्तव में स्वयं को समझाने की आवश्यकता है। – jason

5

नहीं, यह पूरी तरह स्वीकार्य है। यहां तक ​​कि अनुशंसित।

4

इतना ही नहीं अच्छा अभ्यास है, लेकिन आपकी परियोजना इसके बिना संकलित नहीं होगी, क्योंकि IEnumerable<T> विरासत IEnumerableIEnumerable<T> की परिभाषा को देखो:

public interface IEnumerable<out T> : IEnumerable 
    IEnumerator<T> GetEnumerator(); 
} 

आप गैर जेनेरिक वर्जन लागू करने के लिए है या आप एक त्रुटि मिल जाएगा "... इंटरफ़ेस सदस्य ... लागू नहीं है"

+0

आपने सवाल को गलत समझा। – jason

+0

ओह, विकल्प क्या है? –

+0

मुझे यह नहीं मिला है। मुझे लगता है कि मैंने जेनेरिक के साथ ऐसा करने के लिए सीखा है, वही गणक वापस नहीं करने के लिए मेरे साथ कभी नहीं हुआ। –

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