2010-03-07 4 views
4

Je suis en train de le faire:L'affectation de liste de l'enfant au parent

List<Parent> test = new List<Child>(); 

Le code complet de ma classe est la suivante:

class Program 
{ 
    public static void Main(string[] args) 
    { 
     List<Parent> test = new List<Child>(); 

     test.Add(new Child()); 

     test.Add(new AnotherChild()); 
    } 
} 

class Parent { } 

class Child : Parent { } 

class AnotherChild : Parent { } 

peut someebody s'il vous plaît me explian pourquoi cela me donne cette erreur :

Error 2 Cannot convert type 'System.Collections.Generic.List' to 'System.Collections.Generic.List' d:\personal\documents\visual studio 2010\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs 20 24 ConsoleApplication3

Et pourquoi cela fonctionne-t-il?

Parent[] test = new Child[10]; 
List<Parent> result = test.ToList(); 

Merci :)

- droit:

Je sais maintenant pourquoi: la liste est compilée à List`1 et Liste à List`2. Et ils n'ont aucune relation.

Répondre

6

Mise à jour: parce que les deux types, List<Parent> et List<Child> ne sont pas co-variant.

Même si le paramètre générique que vous transmettez, Child, hérite de Parent, la relation n'est pas transmise dans les types Liste fermée. Ainsi, les deux types de liste résultants ne sont pas interchangeables.

.Net 4.0 introduit la co-variance/contra-variance. Votre code ne fonctionnera quand même pas avec .Net 4.0, puisque ni la classe List ni l'interface IList ne seront modifiées pour être co-variantes.

3

Vous ne pouvez pas faire cela parce que List<Child> est incessible à List<Parent>, même si Childest assignable à Parent. Le type List<T> est invariant.

Y at-il une raison pour laquelle vous ne pouvez pas utiliser quelque chose comme ça à la place?

public static void Main(string[] args) 
{ 
    List<Parent> test = new List<Parent>(); 

    test.Add(new Child()); 

    test.Add(new AnotherChild()); 
} 
+0

Cela fonctionne, mais je voulais connaître la raison. Maintenant je comprends. Merci. – Snake

1

Utilisez cette

List<Parent> test = new List<Child>().Cast<Parent>().ToList(); 
1

Generics en C# sont invariantes, ce qui signifie qu'il n'y a aucune relation de sous-type entre les différentes instances d'un type générique.

Conceptuellement parlant, List<Child> ne peut pas être un sous-type de List<Parent>, parce que vous pouvez insérer une instance de AnotherChild dans un List<Parent>, mais pas dans un List<Child>.

+1

Notez que dans C# 4, il y aura une variance générique * limitée *. Cela ne ferait aucune différence dans ce cas, mais vous seriez capable de convertir 'IEnumerable ' en 'IEnumerable '. –

+0

Intéressant, je ne le savais pas. Merci! – meriton

Questions connexes