2009-01-29 7 views

Répondre

0

Ceci est un aspect intéressant et assez complexe des systèmes de type statique. Les termes que vous recherchez sont Covariance et Contravariance.

Le langage C# obtiendra cela pour certaines sortes d'opérations sur les types génériques dans la version 4.0, mais sous une forme quelque peu limitée.

Vous avez à un certain degré déjà sous la forme de

object[] x = new string[1]; 

Ce qui est permis car les tableaux sont traités covariante, ce qui signifie que vous pouvez alors effectuer les opérations suivantes:

x[0] = new object(); 

qui lancerait une exception à l'exécution. Est-ce que vous voyez comment en serait de même pour vous dictionnaires ...

Le C# 4.0 spec est toujours non finale est donc sujet à changement, mais pour des discussions et des explications, voir this question

4

n ° Vous êtes en cours d'exécution le problème de la variance générique, qui n'est pas supporté dans .NET sauf de quelques manières très particulières.

Voici la raison: après votre dernière ligne, vous avez un dictionnaire unique avec deux "vues" dessus, efficacement. Maintenant, imaginez que vous avez écrit:

DictA.Add(1, New A()) 

(Toutes mes excuses si mon VB est légèrement.) Cela a inséré un « non B » dans le dictionnaire, mais DictB pense que toutes les valeurs seront des instances de B.

L'un des principaux objectifs des génériques est d'intercepter les défaillances de type potentielles au moment de la compilation plutôt que le temps d'exécution - ce qui signifie que ce code ne peut pas être compilé, ce qui est précisément dû au manque de variance.

C'est un peu contre-intuitif quand vous êtes habitué à l'héritage normal, mais cela a du sens. Un tas de bananes n'est pas seulement une collection de fruits - c'est une collection de bananes. Java prend une position quelque peu différente à ce sujet en utilisant le caractère générique du côté de l'appelant - il vous laisse voir juste le côté "ajout" du dictionnaire pour DictB, par exemple, tout ce que vous ajoutez à DictB serait bien dans DictA . Les génériques de Java sont très différents des génériques .NET ...

0

Malheureusement non. C'est une absence connue de soutien de covariance/contravariance. Le CLR le supporte, mais pas les compilateurs pour C# et VB.Net.

La prochaine version de C# (4.0) le supporte réellement maintenant, mais pas sûr de vb.net. De même, avec System.Linq, l'une des méthodes d'extension est Cast(), ce qui vous permet de transtyper d'une collection d'un type à un autre. Cependant, il retournera toujours IEnumerable, donc vous devrez manipuler un peu, mais je pense que les types de valeur-clé seront plus difficiles que les collections avec un seul type générique.

Questions connexes