Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Nouveautés de Visual Basic 2010 [VB10] : Générique Variance, Covariance, Contravariance

Nous voici quasiment au terme des nouveautés de Visual Basic 2010 (VB10).  Abordons cette fois-ci la notion de Generic Variance induisant celles de Covariance et Contravariance !  (oulà, çà commence à faire mal dès le titre ;p)

Tentons ainsi de comprendre étape par étape la problématique et surtout comment le compilateur de Visual Basic 2010 nous permet de résoudre le problème !

1. Generic Variance

Un aspect des génériques (qui peut pour le moins surprendre) est que l’écriture suivante est considérée comme non valable :

image

Effectivement, la seconde affectation n’est pas valable car “Strings” ne possède par le même Type que Objets qui est de Type List(Of Object) (Bien que celui en hérite naturellement) // Object < String ! 

Et pour cause, si cette écriture s’avérait valable, nous pourrions rencontrer le cas suivant :

image

Ceci nous permettrait ainsi d’insérer un Type Entier dans une liste de Strings et ultérieurement l’extraire non plus comme un Type Entier mais comme un Type String…  Ceci aurait pour fâcheuse conséquence d’ouvrir une brèche de sécurité de notre Type en cours !

Cependant, il y a certaines interfaces où ce qui précède ne peut pas se produire, notamment quand il n’y a aucune manière d'insérer un objet dans la collection.  Prenons le cas d’un IEnumerable(Of T) :

image

Assurément, nous n’avons dans ce cas précisément pas de méthode permettant d’ajouter ou assigner un élément !  La notion de Generic Variance vient du souhait de permettre ce type de tâche dans le cas où le Type exploité est sûr !

2. Covariance

Au sein du .NET Framework 4.0, l’élément d’interface IEnumerable(Of T) est déclaré comme suit :

image

Le mot clé Out dans cette déclaration signifie que T ne peut se produire dans une position de sortie au sein de l’interface (le cas échéant, le compilateur VB refusera la commande).  Dans ce cas précis de restriction, l’interface devient un “Covariant” de T … ceci signifiant que dès lors, tout IEnumerable(Of A)  pourra être considéré comme un IEnumerable(Of B) pour autant que celui-ci est une possible conversion de référence vers B ! 

Ce qui dans notre cas précisément (exemple précédent), nous donnera l’écriture suivante :  

image

Ainsi toute séquence de Strings devient également de facto une séquence de Objets.  

3. Contravariance

Dans la même lignée, le Type Parameters peut aussi subir une modification avec le “In”.  Cette modification permet de restreindre celui-ci à produire uniquement certaines position en input !  Prenons l’exemple relaté dans la documentation officielle avec le IComparer(Of T) :

image

Le résultat légèrement déconcertant est qu'un IComparer(Of Object) peut en fait être considéré comme un IComparer(Of String) !!!

Cela prend cependant tout son sens lorsque vous pensez comme suit : “ Si un IComparer(Of T) peut comparer deux objets quelconques de Type Object, il peut certainement comparer deux Types String. Cette particularité est ainsi désignée sous le nom de “Contravariance” !!!

Un type générique peut simultanément subir une modification en In et en Out sur ses paramètres types.

4. Limitations du modèle

Les paramètres de type variable ne peuvent être déclarés que dans le cadre d’interface et délégués, ceci du à une restriction de la CLR.

La notion de Variance ne s’applique dès lors qu’il existe une conversion de référence possible entre deux types d’arguments.  Par exemple, un IEnumerable(Of Integer) ne pourra être un IEnumerable(Of Object) de part le fait que la conversion d’un Integer vers un Object est considérée comme une conversion de type boxing et non comme une conversion de référence.

Quelques références afin de vous permettre tout comme moi de creuser le sujet :

Redo
Member of WygTeam

Publié samedi 7 février 2009 09:22 par redo
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- L’application des MiniDrones Parrot est aussi disponible pour Windows 8.1 par Blog de Jérémy Jeanson le 10-28-2014, 15:01

- L’application des MiniDrones Parrot est enfin disponible pour Windows Phone par Blog de Jérémy Jeanson le 10-27-2014, 09:49

- Mise à jour Samsung 840 EVO sur core server par Blog de Jérémy Jeanson le 10-27-2014, 05:59

- MVP Award 2014 ;) par Blog de Jérémy Jeanson le 10-27-2014, 05:42

- « Naviguer vers le haut » dans une librairie SharePoint par Blog de Jérémy Jeanson le 10-07-2014, 13:21

- PowerShell: Comment mixer NAGIOS et PowerShell pour le monitoring applicatif par Blog Technique de Romelard Fabrice le 10-07-2014, 11:43

- ReBUILD 2014 : les présentations par Le blog de Patrick [MVP Office 365] le 10-06-2014, 09:15

- II6 Management Compatibility présente dans Windows Server Technical Preview avec IIS8 par Blog de Jérémy Jeanson le 10-05-2014, 17:37

- Soft Restart sur Windows Server Technical Preview par Blog de Jérémy Jeanson le 10-03-2014, 19:43

- Non, le certificat public du CA n’est pas un certificat client !!! par Blog de Jérémy Jeanson le 10-03-2014, 00:08