c# 协变和逆变

首先这是一个关于泛型的知识,过于冷门,以至于我在书的夹缝中才找到关于它简短的说明。

而且干活这么久确实没用过


可变性分为三种,协变逆变不变
仅将派生类型用作输出值与构造委托有效性之间的常数关系叫做协变。为了让编译器知道我们的期望,必须通过out关键字来进行标记委托声明中的类型参数。
Eg:

Delegate T Factory<out T>();

比如有两个数值,A是基类,B是派生自A。
各自封装成不同的委托类型,这时尽管B派生自A但编译器会报错,因为这两个对象此时为同级的委托对象,这样两者之间实际上并没有派生关系,因此以往的赋值兼容不适用。
我们希望能够返回一个关于A的引用,如果返回指向B也应可以,因为根据兼容性B指向了A,但由于委托类型的不匹配,因此不能这样进行操作。
假如只用作输出值,同样的情况也适用于任何委托。
这样我们传入一个A类型的对象,但实际上传入了B,因为B派生自A,这样调用的代码就能够接受B类型的对象,从而达到可以自由访问B的基类A的部分,最后返回B ,但原本在B的基类A却发生了改变。

逆变
在期望传入基类时允许传入派生对象的特性叫做逆变

有人看到这,你逆变就写了一行???

其实不是我不想写,而是这俩写出来东西太过于相近,以至于看资料到这我也蒙,我擦,这俩你要这么写有个啥区别?

区别:协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型。

所以.....逆变就写了一行...

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

作孽就得先起床

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值