Puis-je avoir un type qui est à la fois, covariant et contravariant, à savoir entièrement fongibles / variable avec des sous et types de super?

StackOverflow https://stackoverflow.com/questions/2809932

Question

Puis-je avoir un type (pour oublier maintenant sa sémantique) qui peut être Covariant ainsi que contravariante?

par exemple:

public interface Foo<in out T>
{
    void DoFooWith(T arg);
}

Off sur le blog de Eric Lippert pour la viande et les pommes de terre de la variance dans C # 4.0 comme il y a peu d'autre part, qui couvre bien du terrain sur le sujet.


Je l'ai essayé de toute façon, pas laisser seulement il pas, mais il me dit que je suis manque le point entier. Je dois comprendre le lien entre lecture seule, écriture seule et la variance.

Je suppose que je suis un peu plus à faire la lecture.

Mais tout court, des réponses induisant Epiphany sont les bienvenus, quant à lui.

Était-ce utile?

La solution

Non, vous ne pouvez pas faire cela.

Supposons que était légal. Vous faites un IFoo<Giraffe>. Depuis IFoo est covariante en T, vous pouvez le convertir par typesafe conversion de référence à IFoo<object>. Comme il est contravariant, vous pouvez convertir en IFoo<Banana>. Qu'est-ce que la sémantique possible sont là pour IFoo<T> tel qu'il est logique d'être en mesure de convertir un IFoo de Girafes à un IFoo de bananes par conversion de référence? Girafes et bananes ont rien en commun que d'être les types de référence. Vous ne pouvez éventuellement avoir une méthode sur IFoo<Banana> qui retourne une banane, car il pourrait en fait être une mise en œuvre de IFoo<Giraffe>; comment l'auteur de la mise en œuvre ne saurait remettre une banane? Vous ne pouvez pas avoir peut-être une méthode sur IFoo<Banana> qui prend une banane pour la même raison; l'implémenteur de IFoo<Giraffe> vous attend de lui remettre une girafe.

Voici une autre façon de regarder:

  • "T" dans des moyens (environ) "T apparaît seulement dans des positions d'entrée".
  • "T" sur les moyens (environ) "T apparaît uniquement dans des positions de sortie".

Par conséquent, « dans des T » signifierait ... quoi? Comme nous l'avons déjà vu, il ne peut signifier que « T ne semble pas du tout dans une méthode ou une propriété. » Quel est le point de faire un type générique T où vous utilisez jamais T?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top