In einem Versuch, die Dinge "einfach" zu halten, verfügt .NET nur über ein generisches / nicht generisches Schnittstellenpaar für Dinge, die durch Aufrufen GetEnumerator()
und anschließendes Verwenden MoveNext
und Verwenden Current
des daraus empfangenen Objekts aufgelistet werden, obwohl es mindestens vier Arten von Objekten gibt die nur diese Methoden unterstützen sollten:
- Dinge, die mindestens einmal aufgezählt werden können, aber nicht unbedingt mehr.
- Dinge, die in Kontexten mit freiem Thread beliebig oft aufgezählt werden können, aber jedes Mal willkürlich unterschiedliche Inhalte liefern können
- Dinge, die in Free-Thread-Kontexten beliebig oft aufgezählt werden können, aber garantieren können, dass alle Aufzählungen denselben Inhalt zurückgeben, wenn Code, der sie wiederholt auflistet, keine mutierenden Methoden aufruft.
- Dinge, die beliebig oft aufgezählt werden können und garantiert jedes Mal den gleichen Inhalt zurückgeben, solange sie existieren.
Jede Instanz, die eine der höher nummerierten Definitionen erfüllt, erfüllt auch alle niedrigeren, aber Code, der ein Objekt erfordert, das eine der höheren Definitionen erfüllt, kann brechen, wenn eine der niedrigeren Definitionen angegeben wird.
Es scheint, dass Microsoft entschieden hat, dass Klassen, die implementieren IEnumerable<T>
, die zweite Definition erfüllen sollten, aber nicht verpflichtet sind, etwas Höheres zu erfüllen. Es gibt wohl nicht viel Grund, warum etwas, das nur die erste Definition erfüllen könnte, IEnumerable<T>
eher implementiert werden sollte als IEnumerator<T>
; Wenn foreach
Schleifen akzeptieren könnten IEnumerator<T>
, wäre es sinnvoll, Dinge, die nur einmal aufgezählt werden können, einfach die letztere Schnittstelle zu implementieren. Leider sind Typen, die nur implementiert IEnumerator<T>
werden, in C # und VB.NET weniger bequem zu verwenden als Typen, die über eine GetEnumerator
Methode verfügen .
In jedem Fall gibt es noch IEnumerable<T>
keine solchen Typen , obwohl es nützlich wäre, wenn es verschiedene Aufzählungstypen für Dinge gäbe, die unterschiedliche Garantien geben könnten, und / oder eine Standardmethode, um eine Instanz zu fragen, die implementiert, welche Garantien sie geben kann.