2014-05-14 2 views
1

Je:héritage (travail avec Collection.Generic)

class A : IHelp 

class B : IHelp 

Je veux faire une telle chose comme:

List<A> alist = new List<A>(); 

List<IHelp> hList = (List<IHelp>) alist; // Error!!! 

Je suis un programmeur débutant. Je vous serai très reconnaissant pour la réponse détaillée. Merci pour l'aide!

+2

Recherchez la covariance et la contravariance. – paqogomez

Répondre

3

Vous ne pouvez pas faire une distribution comme ceci, car cela viole les contraintes de la liste originale. Supposons que cela fonctionne comme vous avez dit (il donne en fait une erreur, mais supposons qu'il fonctionne):

List<A> aList = new List<A>(); 
List<IHelp> hList = aList; // Compile error, but say it would have worked.. 

alors, vous auriez pu faire:

hList.add(new B()); // WHAT?? 

Cela n'a pas de sens, parce que vous ne pouvez jamais ajouter un élément de type B à la liste originale de type A. C'est pourquoi C# vous empêche de faire l'affectation que vous voulez.

0

Ces deux classes partage certaines propriétés (ex: ToString()) La liste pourrait utiliser ces propriétés ne

que nous pouvons faire:

List<object> list = new List<object>(); 
list.Add("foo"); 
list.Add(5); 

foreach(object o in list) 
{ 
    Console.WriteLine(o.ToString()); 
} 

J'ai la même question.

lirons: http://msdn.microsoft.com/en-gb/library/ee207183.aspx

Voici quelque chose plus étrange:

object[] array = new string[10];  // Possible <-- /!\ not secured. 
List<object> list = new List<string>(); // Impossible 

Edit: Eh oui, je ne comprenais pas votre exemple, méta ^^ »

Mais, nous pouvons ne veut pas ajouter quelque chose, il suffit de lire.

ReadOnlyCollections ne sont pas contravariants aussi:/

Edit 2: Bon sang. Je viens de comprendre le problème. (Le 'out' mot-clé)

Je n'ai pas .NET 4.0: '(je vais utiliser des tableaux ^^

(Avec 4.0 -> IEnumerable permet)

(avec Unity3D)