Eine Frage, über IEnumerator.GetEnumerator in C #
-
03-10-2019 - |
Frage
Ich habe eine Frage über die IEnumerator.GetEnumerator()
Methode.
public class NodeFull
{
public enum Base : byte {A = 0, C, G, U };
private int taxID;
private List<int> children;
public int TaxID
{
get { return taxID; }
set { taxID = value; }
}
public int this[int i]
{
get { return children[i]; }
set { children[i] = value; }
}
public IEnumerator GetEnumerator()
{
return (children as IEnumerator).GetEnumerator();
}
public TaxNodeFull(int taxID)
{
this.taxID = taxID;
this.children = new List<int>(3);
}
}
Wenn ich versuche, zu kompilieren, Fehlermeldung sagt
‚System.Collections.IEnumerator‘ enthält keine Definition für ‚GetEnumerator‘ enthalten und keine Erweiterung Methode ‚GetEnumerator‘ ein erstes Argument vom Typ ‚System.Collections.IEnumerator‘ akzeptieren konnte gefunden werden (möglicherweise fehlt eine using-Direktive oder eine Montage Referenz?)
Gibt es etwas falsch mit dem Code?
Vielen Dank im Voraus
Danke Jungs. Ich habe es.
Lösung
Es ist IEnumerable.GetEnumerator()
(oder IEnumerable<T>.GetEnumerator()
), nicht IEnumerator.GetEnumerator()
. Die Mitglieder auf IEnumerator
sind MoveNext()
, Current
und Reset()
(und Dispose
für die generische Version). Die IEnumerable
ist „etwas, das iteriert werden kann“ (zum Beispiel einer Liste) und der IEnumerator
repräsentiert den aktuellen Zustand innerhalb dieser Iteration -. Wie ein Datenbank-Cursor
Es ist etwas seltsam, dass die Klasse nicht implementiert IEnumerable
oder IEnumerable<T>
selbst. Ich würde so etwas wie dies erwarten:
class NodeFull : IEnumerable<int>
{
... other stuff as normal ...
public IEnumerator<int> GetEnumerator()
{
return children.GetEnumerator();
}
// Use explicit interface implementation as there's a naming
// clash. This is a standard pattern for implementing IEnumerable<T>.
IEnumerator IEnumerable.GetEnumerator()
{
// Defer to generic version
return GetEnumerator();
}
}
Andere Tipps
Kinder ist List<int>
, die Geräte IEnumerable<int>
und IEnumerable
. Die GetEnumerator()
Methode ist für die Schnittstellen definiert, nicht für IEnumerator
.
children as IEnumerator
in null führen sollte.
Es gibt keine GetEnumerator()
Methode auf der IEnumerator Schnittstelle. Versuchen Sie, die IEnumerable Schnittstelle vielleicht zu benutzen?