2016-04-22 7 views
1

in Visual Studio 2015, als ich nach List.cs gehen und Klassendeklaration sehen, ich sehe nur eine Methode namens GetEnumerator:Liste GetEnumerator Rückgabetyp entspricht nicht Schnittstelle

public Enumerator GetEnumerator(); 

Auf der anderen Seite ist die Schnittstelle IEnumerable <T> und IEnumerable gibt an, dass es Verfahren, das definieren muss Format:

IEnumerator<T> GetEnumerator(); 
IEnumerator GetEnumerator(); 

das machte mich glauben, dass Interface-Methode auch umgesetzt werden kann, obwohl der reuturn Typ paßt nicht excatly. Obwohl, das hat sich als falsch herausgestellt, als ich es versuchte.

Was passiert hier?

Antwort

0

Wenn Sie an der Quelle betrachten, werden Sie zwei verschiedene GetEnumerator Methoden siehe:

public Enumerator GetEnumerator() { 
    return new Enumerator(this); 
} 

IEnumerator<T> IEnumerable<T>.GetEnumerator() { 
    return new Enumerator(this); 
} 

Die zweite wird nur verwendet, wenn Sie das Objekt durch die IEnumerator-Schnittstelle zugreifen. Beide verwenden jedoch dieselbe zugrunde liegende Implementierung.

[Serializable] 
public struct Enumerator : IEnumerator<T>, System.Collections.IEnumerator 
{ 
    ... 
} 

Sie können weiterhin auf die stark typisierte Version erhalten, wie folgt:

var exampleList = new List<string>(); 
var enumerator1 = ((IEnumerable<string>)exampleList).GetEnumerator() 
var enumerator2 = (IEnumerable<string>) exampleList.GetEnumerator() 

Für enumerator1 Sie die Liste werfen die GetEnumerator() -Methode für die IEnumerable-Schnittstelle zu verwenden. Für enumerator2 verlassen Sie sich auf die Tatsache, dass in jedem die gleiche Implementierung verwendet wird und Sie daher den Enumerator einfach umwandeln können.

+0

Bedeutet das nicht, dass die Klasse keine Implementierung hatte, konnte ich in der Metadatenansicht keine explizite Implementierung von GetEnumerator sehen, da sie privat war? –

+0

Sie können eine Umwandlung durchführen, um die stark typisierte Implementierung zu sehen. Ich werde meinen Beitrag oben bearbeiten, um das klarzustellen. –

+0

Danke, es war hilfreich –

0

Die Schnittstelle ist explizit implementiert. Die Methode, die Sie sehen, ist nicht die Schnittstellenimplementierung, sondern eine separate Methode für die Klasse.

Verwandte Themen