逆變

IComparer<T> 何時是不同的 IComparer<T1> 的子型別?當 T1T 的子型別時。IComparerT 引數中是逆變的,這意味著 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 關鍵字宣告 Contravariant 型別引數,因為該引數必須僅用作輸入

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

宣告為逆變的型別引數可能不會顯示為輸出。

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