C# Language Interfaces de variantes


Exemple

Les interfaces peuvent avoir des paramètres de type variant.

interface IEnumerable<out T>
{
    // ...
}
interface IComparer<in T>
{
    // ...
}

mais les classes et les structures ne peuvent pas

class BadClass<in T1, out T2>  // not allowed
{
}

struct BadStruct<in T1, out T2>  // not allowed
{
}

ni faire des déclarations de méthodes génériques

class MyClass
{
    public T Bad<out T, in T1>(T1 t1)  // not allowed
    {
        // ...
    }
}

L'exemple ci-dessous montre plusieurs déclarations de variance sur la même interface

interface IFoo<in T1, out T2, T3>
//  T1 : Contravariant type
//  T2 : Covariant type 
//  T3 : Invariant type
{
    // ...
}

IFoo<Animal, Dog, int> foo1 = /* ... */;
IFoo<Dog, Animal, int> foo2 = foo1;  
// IFoo<Animal, Dog, int> is a subtype of IFoo<Dog, Animal, int>