2011-01-14 7 views
6

Grundsätzlich nehme an, Sie einige Sammlung haben:Ist es OK IEnumerator <T> .GetEnumerator() in IEnumerator.GetEnumerator() zurückzugeben?

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

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

Ist das akzeptabel? Oder ist diese fehleranfällige oder schlechte Übung? Ich werde immer die IEnumerator<T> verwenden, aber ich möchte immer noch die nicht-generische Version stabil und ordnungsgemäß implementiert werden.

+0

Ich bin sicher, du meinst ** IEnumerable ** eher dann ** IEnumerator ** ... –

+0

Danke Entschuldigung, ich schrieb dieses Beispiel schnell. –

Antwort

10

Dies ist vollständig Standard und wird empfohlen, um DRY und andere Bedenken zu erfüllen.

Beachten Sie, dass

return strand; 

sollte Zusätzlich

yield return strand; 

sein, es sieht aus wie this.Strands implementiert bereits IEnumerable<FurStrand> so könnte man sagen, nur

return this.Strands.GetEnumerator(); 
+1

Ich stimme zu, gute Praxis –

+0

Danke Mann, tut mir leid, ich habe gerade diese Probe gemacht, so vergaß die Ausbeute. –

+0

@Downvoter: Sie müssen sich wirklich erklären. – jason

5

Nein, das ist absolut akzeptabel. Empfohlen sogar.

4

Dies ist nicht nur eine gute Praxis, aber Ihr Projekt wird nicht ohne es kompilieren, weil IEnumerable<T> erbt IEnumerable. Schauen Sie sich die Definition von IEnumerable<T>:

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

Sie haben die nicht-generische Version zu implementieren oder Sie eine Fehlermeldung erhalten „... nicht-Schnittstellenelement nicht implementiert ...“

+0

Sie haben die Frage missverstanden. – jason

+0

Oh, was ist die Alternative? –

+0

Ich verstehe es nie. Ich glaube, ich habe es mit Generika so gemacht, dass ich nie den gleichen Enumerator zurückgegeben habe. –

Verwandte Themen