2010-09-17 4 views
1

J'ai une question à propos de la méthode IEnumerator.GetEnumerator().Une question à propos de IEnumerator.GetEnumerator en C#

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); 
    } 
} 

Lorsque je tente de compiler, message d'erreur dit

« 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' peut être trouvé (manque-t-il une directive using ou une référence d'assembly?)

Y at-il un problème avec le code?

Merci à l'avance


Merci les gars. Je l'ai.

Répondre

8

C'est IEnumerable.GetEnumerator() (ou IEnumerable<T>.GetEnumerator()), pas 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é sur" (par exemple une liste) et le IEnumerator représente l'état actuel dans cette itération - comme un curseur de base de données.

Il est légèrement étrange que votre classe n'implémente pas 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(); 
    } 
} 
+0

Monsieur, quand l'IEnumerator IEnumerable.GetEnumerator sera-t-il utilisé? Si je retourne simplement null dans cette méthode, alors je peux itérer sur la collection en utilisant foreach. Ai-je besoin d'avoir un scénario de nom en conflit dans les implémentations et d'implémenter l'interface explicitement sur cette classe ?? – Dinesh

+0

@ DnshPly9: Vous en auriez besoin pour tout ce qui utilise l'interface non générique 'IEnumerable' à la place. –

1

Il n'y a pas de méthode GetEnumerator() sur l'interface IEnumerator. Essayez-vous d'utiliser l'interface IEnumerABLE peut-être?

2

enfants est List<int>, qui implémente IEnumerable<int> et IEnumerable. La méthode GetEnumerator() est définie pour ces interfaces, pas pour IEnumerator.

children as IEnumerator devrait aboutir à null.