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

- Compte rendu : SharePoint / O365 : des pratiques pour une meilleure productivité par The Mit's Blog le 12-12-2014, 18:11

- [TFS] Suppression des feature SQL Entreprise en masse par Blog de Jérémy Jeanson le 12-06-2014, 09:18

- [Clean Code] règles de nommage par Fathi Bellahcene le 12-04-2014, 22:59

- Windows To Go 10 et Upgrades impossibles par Blog de Jérémy Jeanson le 12-04-2014, 21:38

- SharePoint OnPremise: Statistiques d’utilisation pour traquer les sites fantomes par Blog Technique de Romelard Fabrice le 12-03-2014, 10:28

- SharePoint 2007: Script PowerShell permettant le backup de toutes les collections de sites d’une application Web par Blog Technique de Romelard Fabrice le 12-02-2014, 10:00

- Xamarin : un choix précieux par .net is good... C# is better ;) le 12-01-2014, 15:10

- Office 365: Comparaison des composants pour préparer votre migration de SharePoint 2007 vers Office 365 par Blog Technique de Romelard Fabrice le 11-28-2014, 16:20

- Créer un périphérique Windows To Go 10 ! par Blog de Jérémy Jeanson le 11-21-2014, 04:54

- RDV à Genève le 12 décembre pour l’évènement “SharePoint–Office 365 : des pratiques pour une meilleure productivité !” par Le blog de Patrick [MVP Office 365] le 11-19-2014, 10:40