逆變
IComparer<T>
何時是不同的 IComparer<T1>
的子型別?當 T1
是 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
消耗了 T
s 但不生產它們。可以比較任何兩個 Animal
s 的物件可用於比較兩個 Dog
s。
使用 in
關鍵字宣告 Contravariant 型別引數,因為該引數必須僅用作輸入。
interface IComparer<in T> { /* ... */ }
宣告為逆變的型別引數可能不會顯示為輸出。
interface Bad<in T>
{
T GetT(); // type error
}