C#笔记 -- 协变、逆变

协变

理解:在泛型和委托中, 让使用某个泛型参数A的类型可以用一个使用由A派生的泛型参数B的类型实例化,(小=> 大)如

// 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, 并且只能用作返回类型,该泛型参数不能用作方法参数使用

逆变

理解: 在泛型和委托中, 让使用某个泛型参数A的类型可以用一个使用A父类级别的泛型参数B的类型实例化,(大=>小)如

// 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, 并且只能被使用,或者作为方法参数,不能用作返回类型

总结

返回结果的协变性

使用类型的逆变性

参考资料

那些年搞不懂的"协变"和"逆变"

转载于:https://www.cnblogs.com/clockwork/p/6515521.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值