理解:在泛型和委託中, 讓使用某個泛型參數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
使用類型的逆變性繼承