La Conversion de IEnumerable<T> IList
Si une méthode prend un paramètre de type de Système.Les Collections.IList puis-je légitimement/en toute sécurité passer une valeur de type System.Collections.Generic.IEnumerable<T>
?
Je vous serais reconnaissant une explication détaillée des raisons pour lesquelles ce qui est possible et ce qui se passe réellement à l'objet T
lorsque le IEnumerable<T>
est utilisé à l'intérieur de la méthode.
Est-il converti à la base type d'Objet?
Est-il utilisé comme un System.Collections.IEnumerable
?
Sont t-il des scénarios où cela va poser des problèmes (c'est à dire des problèmes de performances)?
Merci d'avance,
Jean
OriginalL'auteur John Maloney | 2010-01-04
Vous devez vous connecter pour publier un commentaire.
Pas, Vous ne pouvez pas passer une
IEnumerable<T>
une méthode qui prendIList
. L'interfaceIEnumerable<T>
n'est pas convertible àIList
et tente de transmettre une variable de typeIEnumerable<T>
à une méthode de prise deIList
entraînera une erreur de compilation.Pour faire ce travail, vous devrez effectuer l'une des opérations suivantes
IEnumerable<T>
, de maintenir une référence à un type qui implémente à la foisIEnumerable<T>
etIList
.List<T>
est un bon candidat iciIEnumerable<T>
instance pour un nouvel objet qui est convertible enIList
. Par exemple, dans 3.5+, vous pouvez appeler le.ToList()
méthode d'extension pour créer un nouveauList<T>
plus de l'énumération.OriginalL'auteur JaredPar
Vous devrez appeler
ToList()
.http://msdn.microsoft.com/en-us/library/bb342261.aspx
OriginalL'auteur Daniel A. White
Pas. Vous ne pouvez pas, sans l'aide de la
ToList()
méthode d'extension. Je pense que cela ne devrait pas causer de que grand d'un problème de performance - si vous avez une alternative, de temps et de les comparer.Vous pouvez également utiliser
new List<T>(myIEnumerable)
- la documentation indique que cette fonction est uneO(n)
opération, mais je ne peux pas trouver autre chose à propos deToList()
. Aussi, n'oubliez pas queList<T>
met également en œuvreIList
ainsi queIList<T>
.OriginalL'auteur Lucas Jones
IEnumerable ne permet pas un accès indexé de la collection, tandis que IList. Ainsi, IList est plus que IEnumerable et vous ne serez pas en mesure de sortir avec elle. Bien sûr, certaines classes implémenter deux interfaces (List<> par exemple) et ceux qui fonctionnent bien.
Si vous avez besoin d'aller de IEnumerable à IList, vous pouvez essayer un casting tout d'abord, si vous avez de la chance qu'il fonctionne. Si non, vous aurez à utiliser foreach dans la collection IEnumerable et de construire un nouveau IList.
Edit: utiliser ToList() au lieu de foreaching vous-même comme d'autres l'ont suggéré.
OriginalL'auteur David Rutten
Non vous ne pouvez pas passer un IEnumerable. IList implémentant IEnumerable, donc si vous passez votre méthode IList, vous pouvez l'utiliser en toute sécurité comme un IEnumerable. VS ne compile pas les éléments suivants:
Erreur renvoyée:
OriginalL'auteur Yuriy Faktorovich