Wann wird IEnumerable.GetEnumerator anstelle von IEnumerableT.GetEnumerator aufgerufen?

8

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:

  1. In welchem ​​Szenario wird das nicht-generische aufgerufen?
  2. Wie kann ich erzwingen , dass mein Code mit dem nicht generischen IEnumerator ?
  3. ausgeführt wird?
Royi Namir 16.02.2013, 10:34
quelle

3 Antworten

3

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).

    
Jeppe Stig Nielsen 02.02.2015, 19:20
quelle
7

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:

%Vor%

Auf diese Weise können Sie sicher sein, dass beide die gleichen Effekte haben.

    
HugoRune 16.02.2013 10:38
quelle
4

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 .

>     
Wouter de Kort 16.02.2013 10:47
quelle

Tags und Links