106 votes

Comment la covariance générique et la contre-variance sont-elles implémentées dans C # 4.0?

Je n'ai pas assister à la PDC 2008, mais j'ai entendu quelques nouvelles que le C# 4.0 est annoncée pour soutenir Générique de la covariance et de la contra-variance. C'est, List<string> peut être attribuée à l' List<object>. Comment pourrait-ce être?

Dans Jon Skeet du livre C# en Profondeur, il est expliqué pourquoi C# génériques ne prend pas en charge la covariance et de la contra-variance. C'est surtout pour l'écriture de code sécurisé. Maintenant, C# 4.0 changé pour les soutenir. Serait-il apporter le chaos?

Quelqu'un sait les détails sur C# 4.0, vous pouvez donner quelques explications?

155voto

Jon Skeet Points 692016

La Variance ne seront pris en charge dans un sûr moyen - en fait, en utilisant les capacités que le CLR a déjà. Donc les exemples que je donne dans le livre d'essayer d'utiliser un List<Banana> comme List<Fruit> (ou de ce qu'il était) ne fonctionne toujours pas - mais quelques autres scénarios.

Tout d'abord, il sera uniquement pris en charge pour les délégués et les interfaces.

Deuxièmement, il demande à l'auteur de l'interface/délégué pour décorer le type de paramètres que l' in (pour la contravariance) ou out (pour la covariance). L'exemple le plus évident est - IEnumerable<T> qui n'a jamais permet de prendre des valeurs "en dehors" d'il - il ne vous laisse pas en ajouter de nouvelles. Que deviendra IEnumerable<out T>. Qui ne fait pas de mal de type de sécurité, mais vous permet de retourner un IEnumerable<string> à partir d'une méthode déclarée pour retourner IEnumerable<object> par exemple.

La Contravariance est plus difficile de donner des exemples concrets de l'utilisation des interfaces, mais il est facile avec un délégué. Envisager Action<T> - qui représente une méthode qui prend un T paramètre. Il serait agréable d'être en mesure de convertir les utiliser de manière transparente un Action<object> comme Action<string> - toute méthode qui prend un object paramètre va être bien quand il est présenté avec un string à la place. Bien sûr, C# 2 a déjà la covariance et la contravariance des délégués, dans une certaine mesure, mais par le biais d'une conversion d'un type délégué à l'autre (la création d'une nouvelle instance) - voir P141-144 pour des exemples. C# 4 va le rendre plus générique, et (je crois) permettra d'éviter la création d'une nouvelle instance pour la conversion. (Ça va être un conversion de référence à la place.)

Espérons que cela efface un peu - s'il vous plaît laissez-moi savoir si ça n'a pas de sens!

11voto

CMS Points 315406

Voici un bon article qui couvre la covariance à venir et les implémentations de contra-variance sur les délégués et les interfaces de c# 4.0 :

Ferme LINQ : Covariance et Contravariance dans c# 4.0

5voto

Kevin Points 57797

Pas que Jon n'a pas déjà couvert, mais voici quelques liens vers des blogs et des vidéos à partir de Eric Lippert. Il fait un bon travail en expliquant avec des exemples.

http://blogs.msdn.com/ericlippert/archive/tags/Covariance+et+la Contravariance/par défaut.aspx

Les vidéos:

http://blogs.msdn.com/ericlippert/archive/2009/10/26/some-new-videos.aspx

2voto

Thomas Freudenberg Points 3284

Anders Noråse explique en langage c# 4.0 - contra-variance et Covariance le concept et la montre, qu’il a déjà soutenu aujourd'hui à Illinois depuis .NET 2.0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X