2010-05-05 4 views
35

J'exécutait ma propre classe ArrayList et a été laissé surpris quand je me suis aperçu quePourquoi les tableaux dans .net implémentent uniquement IEnumerable et non IEnumerable <T>?

public System.Collections.Generic.IEnumerator<T> GetEnumerator() { 
    return _array.GetEnumerator(); 
} 

ne fonctionne pas. Quelle est la raison pour laquelle les tableaux n'implémentent pas IEnumerator dans .NET?

Y a-t-il des solutions de rechange?

Merci

+4

Pourquoi implémenteriez-vous votre propre classe ArrayList alors qu'il existe déjà plus d'une douzaine de classes de collection existantes? – Aaronaught

+52

Pourquoi pas moi? Je suis fatigué de ce genre de commentaires. –

+4

Nous ne demandons pas ce genre de questions pour vous ennuyer, mais pour savoir ce que vous essayez de faire. Cela nous aide à vous fournir une meilleure réponse. – Steven

Répondre

49

Les tableaux Ænglisc IEnumerable<T>, mais il se fait dans le cadre de la connaissance spéciale de la CLI a pour les tableaux. De nombreux outils ne montreront pas cette implémentation. Voir le paragraphe dans les remarques commençant par "Note de .NET Framework 2.0" dans la documentation documentation (pour les versions antérieures .NET: recherchez le bloc "Important").

Vous pouvez ajouter un casting:

return ((IEnumerable<T>)_array).GetEnumerator(); 
+0

Cela fonctionne comme si la "classe" 'T []' implémentait 'IEnumerable ' par une implémentation _ d'interface explicite. Si vous dites simplement '_array.GetEnumerator()' vous obtenez à la place la méthode 'public' qui a le mauvais type de retour. –

+0

@RayL Voir la version .NET 2.0 de la documentation :-) mise à jour. – Richard

+0

Juste un heads-up. À partir du https://msdn.microsoft.com/en-us/library/system.array.aspx#Remarks référencé: il implémente les interfaces génériques 'IList ', 'ICollection ' et 'IEnumerable '. – Wouter

-1

Vous pouvez utiliser la méthode générique IEnumerable<T> OfType<T>() de l'espace de noms System.Linq, qui étend l'interface IEnumerable. Il filtrera tous les éléments dont le type est différent de T et renverra IEnumerable<T> collection. Si vous utilisez l'opérateur de conversion (IEnumerable<T>)_array, il peut ne pas être sûr, car System.Array (et d'autres types non génériques) stocke les éléments de type System.Object.

+0

Seuls les tableaux d'objets (c'est-à-dire 'Object [] arr') stockent l'élément en tant qu'objet. À part ceux-là, les tableaux sont de type sûr. Cela rend les méthodes OfType et Cast redondantes. – jmoreno

Questions connexes