C# Language Contravariance


Exemple

Quand un IComparer<T> un sous-type d'un autre IComparer<T1> ? Lorsque T1 est un sous-type de T IComparer est contravariant dans son paramètre T , ce qui signifie que la relation de sous-type d' IComparer va dans la direction opposée à celle de T

class Animal { /* ... */ }
class Dog : Animal { /* ... */ }

IComparer<Animal> animalComparer = /* ... */;
IComparer<Dog> dogComparer = animalComparer;  // IComparer<Animal> is a subtype of IComparer<Dog>
// animalComparer = dogComparer;  // Compilation error - IComparer<Dog> is not a subtype of IComparer<Animal>

Une instance d'un type générique contravariant avec un paramètre de type donné est implicitement convertible dans le même type générique avec un paramètre de type plus dérivé.

Cette relation est valable car IComparer consomme T s mais ne les produit pas. Un objet qui peut comparer deux Animal peut être utilisé pour comparer deux Dog .

Les paramètres de type contravariant sont déclarés à l'aide du mot-clé in , car le paramètre ne doit être utilisé qu'en entrée .

interface IComparer<in T> { /* ... */ }

Un paramètre de type déclaré comme contravariant peut ne pas apparaître comme une sortie.

interface Bad<in T>
{
    T GetT();  // type error
}