Une question sur IEnumerator.GetEnumerator en C #
-
03-10-2019 - |
Question
J'ai une question sur la méthode IEnumerator.GetEnumerator()
.
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);
}
}
Quand je tente de compiler, message d'erreur indique
« System.Collections.IEnumerator » ne contient pas de définition pour « GetEnumerator » et aucune méthode d'extension « GetEnumerator » accepter un premier argument de type « System.Collections.IEnumerator » pourrait être trouvée (vous manque une directive ou à l'aide une référence d'assemblage?)
Y at-il quelque chose de mal avec le code?
Merci à l'avance
Merci les gars. Je l'ai.
La solution
de IEnumerable.GetEnumerator()
(ou IEnumerable<T>.GetEnumerator()
), non IEnumerator.GetEnumerator()
. Les membres sur IEnumerator
sont MoveNext()
, Current
et Reset()
(et Dispose
pour la version générique). Le IEnumerable
est « quelque chose qui peut être itéré » (par exemple une liste) et l'IEnumerator
représente l'état actuel dans cette itération -. Comme un curseur de base de données
Il est un peu étrange que votre classe ne met pas en œuvre IEnumerable
ou IEnumerable<T>
lui-même. J'attends quelque chose comme ceci:
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();
}
}
Autres conseils
enfants est List<int>
, qui met en œuvre IEnumerable<int>
et IEnumerable
. La méthode de GetEnumerator()
est définie pour ces interfaces, et non pour IEnumerator
.
children as IEnumerator
devrait conduire à nulle.
Il n'y a pas de méthode GetEnumerator()
sur le IEnumerator . Essayez-vous d'utiliser l'interface IEnumerable peut-être?