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

- Server Essentials 2016 et site remote web access indisponible par Blog de Jérémy Jeanson le 12-09-2016, 13:10

- Office 365: Utiliser les alertes dans SharePoint Online par Blog Technique de Romelard Fabrice le 11-30-2016, 12:45

- Windows: Comment comparer les outils de copie de fichiers disponibles en mode console avec un script PowerShell par Blog Technique de Romelard Fabrice le 11-18-2016, 11:17

- TFS 2017 est disponible ! par Blog de Jérémy Jeanson le 11-17-2016, 08:04

- Office 365: Configurer l’ouverture des fichiers dans Office Web Apps pour une Librarie Documentaire par Blog Technique de Romelard Fabrice le 11-15-2016, 17:14

- Office 365: Comment gérer les Access Requests dans les sites SharePoint Online par Blog Technique de Romelard Fabrice le 11-10-2016, 15:11

- Windows 2008 R2: Réduire la taille du répertoire system volume information par Blog Technique de Romelard Fabrice le 11-07-2016, 10:01

- UWP et langues indisponibles ? par Blog de Jérémy Jeanson le 11-04-2016, 12:54

- Impossible de se connecter à Windows Server Essentials 2016 par Blog de Jérémy Jeanson le 10-29-2016, 09:55

- Changer la langue d’un Windws Server Core 2016 par Blog de Jérémy Jeanson le 10-27-2016, 17:51