Blick auf diesen Code:
%Vor%Läuft:
%Vor%Erträge
%Vor% Ich verstehe, dass die nicht-generische IEnumerator
-Version für Kompatibilität ist.
Frage:
IEnumerator
? Die anderen Antworten verfehlen den Punkt.
Schnittstellen spielen überhaupt keine Rolle, wenn der (Kompilierzeit-) Typ von foreach
ed eine public
nicht-generische nicht-statische Methode namens GetEnumerator
hat, die null Argumente benötigt. (Der Rückgabetyp dieser Methode kann alles sein, generisch oder nicht-generisch: Schnittstellen spielen keine Rolle.)
Der Grund, warum die erste Methode aufgerufen wird, ist, dass dies die Methode public
ist.
Sie können das ändern:
%Vor%Um zu beweisen, dass keine Schnittstellen benötigt werden, versuchen Sie Folgendes:
%Vor% Es ist jedoch sinnvoll, IEnumerable<>
zu implementieren. Dann kann Ihr Typ mit Linq verwendet werden (Erweiterungsmethoden für IEnumerable<>
) und kann als Argument für andere Methoden verwendet werden, die einfach ein IEnumerable<>
benötigen.
Außerdem ist es ratsam, dass die Methode (oder explizite Schnittstellenimplementierung), die das nicht generische IEnumerator
zurückgibt, nur an die Methode (oder explizite Schnittstellenimplementierung) zurückgibt, die IEnumerator<>
zurückgibt. Die zwei unterschiedlichen Sequenzen zu haben ist wirklich verwirrend (aber schön, um Fragen zu stellen und zu beantworten, wie die Dinge funktionieren).
Der nicht-generische IEnumerator wird ausgeführt, wenn Code die Klasse in die nicht-generische Schnittstelle umwandelt:
%Vor%Dies ist hauptsächlich relevant, wenn Sie Ihre Klasse an eine Legacy-Funktion übergeben, für die ein nicht generischer IEnumerator erforderlich ist.
Wenn Sie also eine Bibliothek haben, die eine Funktion enthält, und Sie Ihre Klasse an diese Funktion übergeben, wird sie den nicht-generischen IEnumerator
verwenden %Vor%
Beachten Sie, dass es vollkommen zulässig ist, den nicht generischen IEnumerator einfach mit dem generischen IEnumerator zu implementieren:
Auf diese Weise können Sie sicher sein, dass beide die gleichen Effekte haben.
Die nicht-generische Version von IEnumerable
wird mit einer expliziten Schnittstellenimplementierung implementiert. Dies bedeutet, dass Sie die explizit implementierte Funktion nur aufrufen können, indem Sie auf die Schnittstelle werfen.
Der Grund dafür, dass IEnumerable
explizit implementiert ist, besteht darin, dass die Methodensignaturen bis auf den Rückgabetyp identisch sind.
Casting myWords
explizit auf IEnumerable
ermöglicht es Ihnen, die nicht-generische Version wie folgt aufzurufen: (IEnumerable)myWords
.
Der C # Guide erklärt, wie dies funktioniert: Explizite Schnittstellenimplementierung .
>Tags und Links .net c# ienumerable ienumerator