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

- Nouveau blog en anglais / New blog in english ! par Le blog de Patrick [MVP SharePoint] le il y a 2 heures et 48 minutes

- [ #Yammer ] From Mailbox to Yammer and back / De votre messagerie vers Yammer et retour ! par Le blog de Patrick [MVP SharePoint] le 09-15-2014, 11:31

- [ #Office 365 ] New service settings panel / Nouveau panneau de paramétrage des services par Le blog de Patrick [MVP SharePoint] le 09-11-2014, 08:50

- Problème de déploiement pour une démo SharePoint/TFS? par Blog de Jérémy Jeanson le 09-10-2014, 21:52

- [ #Office365 ] Delve first impressions / Premières impressions sur Delve par Le blog de Patrick [MVP SharePoint] le 09-09-2014, 16:57

- [ #Office365 ] How to change Administration console language ? / Comment changer la langue de la console d’administration ? par Le blog de Patrick [MVP SharePoint] le 09-09-2014, 08:25

- [ #SharePoint 2013 ] Suppression de bases de données en état “Pas de Réponse” par Le blog de Patrick [MVP SharePoint] le 09-04-2014, 14:10

- Changer l’adresse d’une ferme Office Web Apps associée à SharePoint par Blog de Jérémy Jeanson le 09-01-2014, 22:21

- Une ferme #SharePoint 2013 dans @Azure en quelques clics (1ère partie) ! par Le blog de Patrick [MVP SharePoint] le 08-28-2014, 18:52

- SharePoint 2013: Préparation de la migration - Création des site Templates dans 2010 et 2013 par Blog Technique de Romelard Fabrice le 08-20-2014, 16:31