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

- Installer un site ASP.net 32bits sur un serveur exécutant SharePoint 2013 par Blog de Jérémy Jeanson le il y a 7 heures et 55 minutes

- [ SharePoint Summit 2014 ] Tests de montée en charge SharePoint par Le blog de Patrick [MVP SharePoint] le il y a 17 heures et 45 minutes

- [ SharePoint Summit 2014 ] Bâtir un site web public avec Office 365 par Le blog de Patrick [MVP SharePoint] le il y a 19 heures et 59 minutes

- Kinect + Speech Recognition + Eedomus = Dommy par Aurélien GALTIER le il y a 21 heures et 12 minutes

- [ SharePoint Summit 2014 ] Une méthodologie simple pour concevoir vos applications OOTB SharePoint de A à Z par Le blog de Patrick [MVP SharePoint] le il y a 21 heures et 38 minutes

- //Lean/ - Apprendre à faire des Apps Windows universelles par Blog de Jérémy Jeanson le 04-16-2014, 12:57

- Une culture de la donnée pour tous… par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 11:00

- [ SharePoint Summit 2014 ] L’utilisation de SharePoint 2013 pour la mise en place d’un site Internet Grand Public par Le blog de Patrick [MVP SharePoint] le 04-15-2014, 20:51

- [ SharePoint Summit Montréal 2014 ] Mes présentations sont en ligne par Le blog de Patrick [MVP SharePoint] le 04-15-2014, 18:16

- [ SharePoint Summit Montréal 2014 ] L'intelligence d'affaire dans O365 : enfin facile et économique grâce aux dernières évolution de la Power BI par Le blog de Patrick [MVP SharePoint] le 04-15-2014, 17:07