Una domanda su IEnumerator.GetEnumerator in C #
-
03-10-2019 - |
Domanda
Ho una domanda sul metodo 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);
}
}
Quando provo a compilare, messaggio di errore dice
'System.Collections.IEnumerator' non contiene una definizione per 'GetEnumerator' e nessun metodo di estensione 'GetEnumerator' accettare un primo argomento di tipo 'System.Collections.IEnumerator' potrebbe essere trovato (che le manca una direttiva using o un riferimento all'assembly?)
C'è sbagliato qualcosa con il codice?
Grazie in anticipo
Grazie ragazzi. Ho capito.
Soluzione
E 'IEnumerable.GetEnumerator()
(o IEnumerable<T>.GetEnumerator()
), non IEnumerator.GetEnumerator()
. I membri di IEnumerator
sono MoveNext()
, Current
e Reset()
(e Dispose
per la versione generica). Il IEnumerable
è "qualcosa che può essere iterata over" (lista per esempio a) e la IEnumerator
rappresenta lo stato corrente all'interno di tale iterazione -. Come un cursore di database
E 'un po' strano che la classe non implementa IEnumerable
o IEnumerable<T>
stesso. Mi aspetto qualcosa di simile:
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();
}
}
Altri suggerimenti
i bambini è List<int>
, che implementa IEnumerable<int>
e IEnumerable
. Il metodo GetEnumerator()
è definito per tali interfacce, non per IEnumerator
.
children as IEnumerator
dovrebbe portare a nulla.
Non esiste un metodo GetEnumerator()
sulla IEnumerator interfaccia. Stai cercando di utilizzare l'interfaccia IEnumerable forse?