Le direct cast var ListOfY = (List<Y>)ListOfX
n'est pas possible, car cela exigerait co/contravariance de l' List<T>
type, et que tout ne peut pas être garantie dans tous les cas. Veuillez lire la suite pour voir les solutions à ce casting problème.
Alors qu'il semble normal d'être capable d'écrire du code comme ceci:
List<Animal> animals = (List<Animal>) mammalList;
parce que nous pouvons garantir que tous les mammifères seront un animal, ce qui est évidemment une erreur:
List<Mammal> mammals = (List<Mammal>) animalList;
depuis pas chaque animal est un mammifère.
Cependant, à l'aide de C# 3 et ci-dessus, vous pouvez utiliser
IEnumerable<Animal> animals = mammalList.Cast<Animal>();
qui facilite le casting un peu. C'est syntaxiquement équivalent à celui de votre un par un ajout de code, car il utilise un cast explicite cast chaque Mammal
dans la liste à un Animal
, et échoue si le casting n'est pas réussi.
Si vous voulez plus de contrôle sur la coulée / le processus de conversion, vous pouvez utiliser l' ConvertAll
méthode de List<T>
classe, qui peut utiliser une expression à convertir les éléments. Il a ajouté l'avantage qu'il renvoie une List
, au lieu de IEnumerable
, donc pas de .ToList()
est nécessaire.
List<object> o = new List<object>();
o.Add("one");
o.Add("two");
o.Add(3);
IEnumerable<string> s1 = o.Cast<string>(); //fails on the 3rd item
List<string> s2 = o.ConvertAll(x => x.ToString()); //succeeds