Die anderen Antworten irgendwie den Punkt verfehlen.
Interfaces keine Rolle überhaupt, wenn die (kompilieren Zeit) Art das, was foreach
ed wird gerade eine public
nicht-generische nicht-statische Methode GetEnumerator
die Null Argumente annimmt genannt hat. (Der Rückgabetyp dieser Methode kann alles sein, egal ob generisch oder nicht-generisch: Schnittstellen spielen keine Rolle.)
Der Grund, warum die erste Ihrer Methoden heißt, ist, dass dies die public
Methode ist.
Sie können das ändern:
public class myWords : IEnumerable<string>
{
string[] f = "I love you".Split(new string[]{"lo"},StringSplitOptions.RemoveEmptyEntries);
IEnumerator<string> IEnumerable<string>.GetEnumerator()
{
return f.Select(s => s + "2").GetEnumerator();
}
public IEnumerator GetEnumerator()
{
return f.Select(s => s + "3").GetEnumerator();
}
}
Um zu beweisen, dass Schnittstellen nicht benötigt werden, versuchen Sie dies:
public class myWords // no interfaces!
{
string[] f = "I love you".Split(new string[]{"lo"},StringSplitOptions.RemoveEmptyEntries);
public IEnumerator GetEnumerator()
{
return f.Select(s => s + "3").GetEnumerator();
}
}
Allerdings ist es ratsam, IEnumerable<>
zu implementieren. Dann kann Ihr Typ mit Linq (Erweiterungsmethoden auf IEnumerable<>
) verwendet werden und kann als Argument für andere Methoden verwendet werden, die einfach eine IEnumerable<>
erfordern.
Auch ist es ratsam, die Methode (oder explizite Schnittstellenimplementierung), die den nicht generischen IEnumerator
zurückgibt, nur zu der Methode (oder der expliziten Schnittstellenimplementierung) zurückzurufen, 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).
'Enumerable.Cast' – CodesInChaos