Pourquoi ne puis-je pas moulé à partir d'une Liste<Maclasse> Liste<object>?
J'ai une Liste d'objets, qui sont de mon type QuoteHeader
et je veux passer cette liste comme une liste d'objets à une méthode qui est en mesure d'accepter un List<object>
.
Ma ligne de code lit...
Tools.MyMethod((List<object>)MyListOfQuoteHeaders);
Mais j'obtiens l'erreur suivante au moment de la conception...
Cannot convert type 'System.Collections.Generic.List<MyNameSpace.QuoteHeader>'
to 'System.Collections.Generic.List<object>'
Dois-je faire quelque chose pour ma classe pour permettre cela? Je pensais que toutes les classes héritent de l'objet donc je ne peux pas comprendre pourquoi cela ne marcherait pas?
- Pourquoi vous voulez jeter une Liste<T> Liste<object>? Je ne comprends pas la raison, qui est l'utilisation de médicaments génériques alors.
- double possible de c# Cast List<X> Liste<Y> aussi étroitement liés à C# - une Liste<Maclasse> être sans faille en fonte pour une Liste<Interface> ou similaire?
- Si c'était possible, alors vous pouvez ajouter n'importe quel objet à la liste. Violation de la règle qu'un
List<Foo>
ne contient que des objets qui sont d'affectation compatible à Toto. Vous devez créer une nouvelle liste.
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle ce n'est pas légal c'est parce qu'il n'est pas sûr. À supposer qu'il soit juridique:
Mais "animaux" est en fait une liste de girafes; vous ne pouvez pas mettre un tigre dans une liste de girafes.
En C# c'est, malheureusement, juridique avec des tableaux de type de référence:
En C# 4 c'est légal sur IEnumerable mais pas IList:
C'est sûr parce que
IEnumerable<T>
ne pas exposer la méthode qu' prend en un T.Pour résoudre votre problème, vous pouvez:
List<object>
, et l'utilisation non sécuritaire de la matrice de covariance.List<T>
IEnumerable<object>
et utiliser C# 4.Vous ne pouvez pas jeter
List<OneType>
àList<OtherType>
que c'est effectivement le cas de la liste que vous voulez lancer, ainsi que la Liste elle-même.il y a une méthode d'extension qui va vous permettre de le faire (Référence MSDN):
Cette méthode va tenter de jeter chaque instance de la liste d'un type à l'autre type, et de les ajouter à un nouveau énumérable. il va lever une exception si une instance ne peut pas être lancée.
Autant que le système est porté sur les deux types de pour votre les listes sont de différents types, de sorte que c'est comme de dire:
Pour être en mesure de faire le cast il y aurait à être implicite ou explicite la conversion entre les types disponibles, il n'y a pas (sauf si vous avez fourni un qui vous pourriez être en mesure de le faire).
vous vous attendez à ce qu'il fonctionne parce que
List<object>
sera toujours capable de tenir n'importe quel type dans une autre liste, mais quand vous pensez à ce sujet, dans ces conditions, vous pouvez voir pourquoi il ne le fait pas.Je suis sûr qu'il est plus compétent sur le plan technique, mais c'est l'essentiel je pense.
vous pourriez être intéressé par la lecture Eric Lippert de la série sur la Covariance et la Contravariance comme cela peut être utile pour vous.
Cette question peut également être utile
Je suis en supposant que vous voulez dire que les listes sont des types qui héritent l'un de l'autre ou peut être coulé à partir d'un type à l'autre - dans ce cas, essayez ceci:
Merci pour les nombreuses réponses.
Je vais vous expliquer ce que je voulais faire et ce que j'ai trouvé comme solution.
J'ai besoin d'une méthode que je pouvais l'appeler en passant dans une Liste d'objets de tout type, et alors la sortie de cette liste au format XML. Également transmis à la méthode serait une chaîne qui serait un système de fichier de structure de l'emplacement du chemin d'accès qui pointe vers l'emplacement du fichier XML serait enregistré. Comme j'ai un nombre croissant de classes et de types, je voulais éviter d'écrire plusieurs méthodes pour répondre à chaque type de classe. Je ne suis pas sûr si je suis même allé sur ce la bonne manière, mais c'est une solution légère à mon problème et travaille. Si il ya des problèmes avec elle, ou si quelqu'un a des commentaires, n'hésitez pas...
Donc... ma méthode ressemble maintenant à ceci...
... et mon appel de la ligne de lit...
Comme je l'ai dit, il peut ne pas être la tidiest solution, mais il fonctionne bien dans mon scénario.
Le problème est qu'au moment de la Compilation, le compilateur émet 2 classes séparées, 1 qui représente
List<MyClass>
et celui qui représenteList<Object>
. Ils sont essentiellement 2 types distincts. C'est la façon dont les types Génériques de travail, dans .Net au moins.En supposant que c'est .Net, vous pourriez faire
qui, fondamentalement, ne