10
votes

Ilist à iList

J'ai quelques classes:

List<Vehicle> test = new List<Vehicle> ();

foreach ( Car car in cars )
{
   test.Add(car);
}


2 commentaires

Liée à Stackoverflow. com / questions / 981570 / ... et Stackoverflow.com/Questtions/1296892/... au moins.


Robert Harvey: Bien sûr, il y a une solution alternative; Il pourrait créer une implémentation d'IList qui est fondamentalement une enveloppe sur un iList existant. De cette façon, il n'aurait pas besoin de lancer tous les éléments, seuls ceux qui sont nécessaires.


8 Réponses :



12
votes

Ce type de polymorphisme qui vous permet de lancer ilist à ilist est dangereux, car il vous permettrait d'insérer un camion dans votre ilist .


2 commentaires

Il n'essaie pas de le jeter, mais créez une nouvelle instance de liste.


euh non. Il essaie d'attribuer une liste (référence à une) liste du type de base à partir d'une liste (référence à a) du type dérivé et de vous demander pourquoi il obtient NULL. S'il essayait de faire une nouvelle instance, cela fonctionnerait bien.



3
votes

Voici quelques approches utilisant LINQ:

IList<Derived> list = new List<Derived>();
list.Add(new Derived());

IList<Base> otherlist = new List<Base>(from item in list select item as Base);
IList<Base> otherlist2 = new List<Base>(list.Select(item => item as Base));


0 commentaires

1
votes
var vehicles = cars.OfType<IVehicle>()

0 commentaires

4
votes

0 commentaires

2
votes

Vous pouvez également jeter un coup d'œil sur l'article de Cwalina de Krzysztof, Covariance simulée pour les génériques .NET


0 commentaires

0
votes

Si vous devez utiliser ilist code> Tout ce que vous avez de la chance et que les réponses ci-dessus peuvent vous aider. Toutefois, si vous pouvez utiliser un iList code> qui est casse comme ienumerable code>, puis réprimé simplement à la destination comme iliste code>, qui fonctionnerait, qui fonctionnerait, Etant donné que ienumerable code> peut accepter une telle pratique.

// At the source or at the model.
IEnumerable<BaseType> list = new List<Type>();
// At the destination.
IList<BaseType> castedList = (IList<BaseType>)list;


0 commentaires

0
votes

Notez que iReadonlist à partir de .NET 4.5+ vous permettra de lancer iReadonlist dans ireadonlist avec pas de problème. Liste et Collection implémente cette interface.


0 commentaires