Covariance est (à peu près) la capacité de héritage miroir em> de types "simples" dans des types complexes qui les utilisent. Je me demande: quels sont les "types" de la covariance et comment se rapportent-ils à C # (sont-ils soutenus?) Par exemple, un type est type de retour Covariant em>, pris en charge par Java, mais pas C #. P>
J'espère que quelqu'un avec des côtelettes de programmation fonctionnelle peut faire carrer, aussi! p>
Par exemple. Nous pouvons toujours traiter une instance de chat code> comme une instance de
animal code>. Un
ComplexType
ComplexTyPe
Les exemples de code seraient utiles. P>
3 Réponses :
Voici ce que je peux penser:
Après avoir lu les commentaires constructifs et la tonne d'articles pointés (et écrits) par Eric Lippert, j'ai amélioré le Réponse: p> Type de retour COVARANCE FORT>: P> Disponible en Java (> = 5) covariance d'interface strong> Le BCL définit l'interface générique Ainsi, l'exemple suivant est valide: p> Notez qu'un Délégué covariance strong> au moyen de groupes de méthodes
[1] code>
sup> et c ++ [2] code>
sup>, non pris en charge dans C # (Eric Lippert explique Pourquoi pas et Ce que vous pouvez faire à ce sujet ): p> [3] code>
sup> - pris en charge C # p> iEnumerable code> CoVariant: p>
ienumerable code> est par définition "lecture seule" - vous c Je n'ai pas d'ajouter des éléments.
Contrairement à la définition de ilist
.add () code>: p>
[4] code>
sup> - supporté en C # P> A < B => ... => Trainer<A> < Trainer<B>
Juste une note sur la cassette Covariance: Si vous ajoutez une troisième ligne de objarray [1] = nouvel objet (); code>, tandis que legal à la compilation lancera des exceptions au moment de l'exécution. En ce sens, contrairement aux autres exemples, Tarra Covariance est cassé
Bonne liste. Un petit changement que je ferais est de noter qu'il existe deux types de covariance déléguée à partir de C # 4. Le type que vous parlez d'appeler que j'appelle habituellement Méthode GROUP COVARANCE I>. Délégué covariance permet délégué r d
Java utilise le concept de la variance du site em> pour les types génériques: la variance nécessaire est spécifiée sur chaque site d'utilisation. C'est pourquoi les programmeurs Java sont tenus de familiariser avec la règle soi-disant PECS. Oui, c'est difficile à manier et a déjà reçu beaucoup de critiques. p>
+1 intéressant. Ceci Cette question et le lien article donne une description de la différence entre la variance de site d'utilisation (Java) et la variance du site de déclaration (C #).
Merci pour le lien, Cristi, c'est l'une des meilleures réponses dans l'ensemble!
Ceci est mieux expliqué en termes de types de structure plus génériques. Considérer:
Les tuples sont covariants dans leurs deux types de composants, c'est-à-dire (T1, T2)
Les fonctions sont covariantes dans leur résultat et contravaret dans leur argument, c'est-à-dire (T1 -> T2) U2) IFF U1 Types mutables sont invariants, c'est-à-dire mut (t) toutes ces règles sont les règles de sous-typage les plus générales correctes. p> maintenant, un objet ou une interface Tapez comme vous le savez des langues traditionnelles peut être interprété comme une forme de tuple fantaisie contenant ses méthodes comme des fonctions, entre autres. Par exemple, l'interface p> représente essentiellement le type p> où f, g et x correspondent au 1er , 2e et 3ème composante du tuple, respectivement. P> Il découle des règles ci-dessus que c (t, u, v) Un autre exemple: p> est p> ici, d (t) Il existe également un quatrième cas, parfois appelé "Bivariance", ce qui signifie à la fois co et contrevenart en même temps. Par exemple, P> interface E<T> { Int f(Int) }
Je pense que vous confondez deux concepts différents (mais similaires). On s'appelle la covariance et l'autre s'appelle Contravariance.
Si vous recherchez des exemples - presque tous les collections de standard .NET sont covariants.
@Nik correction. Presque toutes les interfaces .NET dans le
System.Generic.Collections CODE> Espace de noms sont Covariant.
@Aron oui, c'est ce que je voulais dire, merci
Il y a un bel article MSDN sur la covariance d'une contrevenance. ici vous allez.
@Aron Soins pour développer cela? Ma compréhension est que: 1. Covariance traduit B> Héritage à des types complexes (
Cat ienumerable code>), et 2. Contravariance inverse la Héritage (
Cat action **> ** action code>). Et je demande seulement covariance b> ici.
Je discute Covariant et Contravariance en Java A> Un peu, c'est probablement une forme différente c # cependant.
Vous voudrez peut-être lire la longue série d'articles que j'ai écrites tout en concevant les caractéristiques de la covariance / de Contravariance ajoutées au C # 4. Celles-ci sont en ordre de la plus récente au moins récente, alors commencez en bas. blogs.msdn.com/b/ericlippert/ Archives / Tags / ...
@ERICLIPPERT WOW, c'est une longue liste! J'ai lu certains de ces articles. Je vais y aller et mettre à jour ma réponse ci-dessous avec les nouvelles découvertes :)
Dupliqué possible de Covariance et Contravariance Exemple de monde réel
@CristidiaconesCu Je rétracte ma déclaration, vous comprenez la covariance et la Contravarariance.