C#筆記 -- 協變、逆變

協變

理解:在泛型和委託中, 讓使用某個泛型參數A的類型能夠用一個使用由A派生的泛型參數B的類型實例化,(小=> 大)如
html

// IEnumerable<Animal> 與 List<Dog> 之間無繼承關係,可是不會報錯,協變
// IEnumerable<out T>
IEnumerable<Animal> animals = new List<Dog>(); 

// 下行會報錯 => List<Dog>  不繼承 List<Animal> 類型, 沒法類型轉化
// List<T>
List<Animal> animals = new List<Dog>();

條件: 使用 泛型修飾符out, 而且只能用做返回類型,該泛型參數不能用做方法參數使用c#

逆變

理解: 在泛型和委託中, 讓使用某個泛型參數A的類型能夠用一個使用A父類級別的泛型參數B的類型實例化,(大=>小)如code

// Action<Dog> 與 Action<Animal> 無繼承關係,不報錯無,逆變
// Action<in T>
Action<Dog> actionDog = new Action<Animal>(a => { Console.WriteLine("animal"); });

// 下行報錯 => Func<Dog> 與 Func<Animal> 無繼承關係,報錯
// Func<Out TResult>
Func<Dog> actionDog1 = new Func<Animal>(() => new Dog());

條件:使用 泛型修飾符in, 而且只能被使用,或者做爲方法參數,不能用做返回類型htm

總結

返回結果的協變性blog

使用類型的逆變性繼承

參考資料

那些年搞不懂的"協變"和"逆變"get

相關文章
相關標籤/搜索