Si j'ai ces deux classes:Ajout d'une collection d'une sous-classe avec AddRange
class A {}
class B : A {}
et je fais une liste <A> mais je veux ajouter une liste <B> à en appelant Liste <A> .AddRange (Liste <B>) mais le compilateur refuse:
Argument '1': cannot convert from 'System.Collections.Generic.List<A>'
to 'System.Collections.Generic.IEnumerable<B>
que je comprends tout à fait parce que IEnumerable <B> n'hérite pas de IEnumerable <A>, son type générique a l'héritage.
Ma solution est d'énumérer Liste <B> et ajouter individuellement des articles parce que la liste <A> .Add (Un élément) travaillera avec les éléments B:
foreach(B item in listOfBItems)
{
listOfAItems.Add(item);
}
Cependant, c'est plutôt non-expressive, car ce que je veux c'est juste AddRange.
Je pourrais utiliser
List<B>.ConvertAll<A>(delegate(B item) {return (A)item;});
mais c'est inutilement compliqué et mal choisi parce que je ne suis pas la conversion, je suis casting.
Question: Si je devais écrire ma propre liste semblable collection quelle méthode j'ajouter à ce qui me permettrait de copier une collection de B dans une collection d'A comme une doublure semblable à la liste <Un> .AddRange (Liste <B>) et conservent le type maximum de sécurité. (Et par le maximum, je veux dire que l'argument est à la fois une collection et une vérification d'héritage de type.)
« échoue si l'argument n'est pas dénombrable ou si l'héritage de type ne fonctionne pas. » - Ce comportement est attendu, au moins pour moi. Qu'attendez-vous, ou comment est-ce un problème? – Lucero
C'est exactement ce que je soupçonne. Je disais que cela répond à mes exigences de sécurité maximale de type. –
Aussi (pas sûr si vous l'avez ajouté dans votre édition) la distribution de "article" à "T" ne devrait pas être nécessaire, puisque le compilateur sait (par la contrainte de type générique) que les types sont compatibles. – Lucero