2010-10-17 6 views
2

j'applique une classe qui enveloppe basiquement un tableau:Problème lors de la mise en œuvre d'une classe d'emballage pour un tableau en essayant de mettre en œuvre IEnumerable

public abstract class IndividualBase : IEnumerable<Gene> 
{ 
    private readonly Gene[] genoma; 

    ... 

    public IEnumerator<Gene> GetEnumerator() 
    { 
     return genoma.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return genoma.GetEnumerator(); 
    } 
} 

Le problème est qu'il me donne des ennuis avec la première GetEnumerator() - il me dit que

Impossible de convertir implicitement le type 'System.Collections.IEnumerator' à 'System.Collections.Generic.IEnumerator'. Une conversion explicite existe (vous manque un casting?)

Bien que je comprenne ce que le problème est, je ne sais absolument pas comment le résoudre. N'importe qui?

Merci

Répondre

7

Vous pouvez essayer:

IEnumerable<Gene> typed = genoma; 
return typed.GetEnumerator(); 

juste pour faire le compilateur heureux. Alors que les tableaux implémentent l'interface générique Enumerable, ceci n'est pas présent sur le GetEnumerator public(). Avec ce qui précède, nous avons simplement cast à l'API préférée. C'est un casting trivial; aucune vérification ne devrait avoir lieu au moment de l'exécution (puisque le compilateur et la CLI savent que c'est valide).

+0

FYI: J'aime mieux que mon 'genoma.Cast () .GetEnumerator()' réponse. La distribution _might_ est assez intelligente pour faire cela sous le capot, mais elle pourrait également ajouter une couche supplémentaire d'indirection pour lancer chaque objet, au lieu de tout. –

+0

+1, réponse la plus efficace. – driis

0

Votre problème est que vous retournez un IEnumerable, pas IEnumerble<Gene>

Modifier à ceci:

return genoma.Cast<Gene>().GetEnumerator(); 

EDIT

En gardant cela autour d'une autre façon de le faire, MAIS, je préfère mieux la réponse de Marc.