C#逆差

示例

什么时候是IComparer<T>不同的子类型IComparer<T1>?WhenT1是的子类型T。IComparer是逆变在其T参数,这意味着IComparer的亚型关系变为在相反的方向作为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>

具有给定类型参数的对立泛型类型的实例可以隐式转换为具有更多派生类型参数的同一个泛型类型。

之所以成立,是因为IComparer 消耗 Ts而不产生它们。可以比较任意两个Animals的对象可以用于比较两个Dogs。

使用in关键字声明相反类型的参数,因为该参数只能用作input

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

声明为相反类型的类型参数可能不会显示为输出。

interface Bad<in T>
{
    T GetT();  // 类型错误
}