C#协变和逆变

  我们知道在C#中,是可以将派生类的实例赋值给基类对象的。

  这是没有什么问题的。下面我们做一些变动。

协变

  Dog类不是继承Animal类么,为什么到这里就不能用了呢?

  原来我们都忽略了一点,在这段代码中dogMarker和animalMarker变量的类型分别是Factory<Dog>和Factory<Animal>他们是没有继承关系的,也就是他们是同级别的。因此我们把dogMarker赋值给animalMarker的时候编译器就报错了。那么我们如果希望上面的代码可以正常运行,那要怎么做呢?

  还记得在学习参数的时候有一个关键字么——out;如果类型参数只用作输出值的话,那么他适用于任何泛型委托。

  这种结构化的委托特效之间的关系就叫做协变。

逆变

同样先来看一段代码

  这次大家知道,报错肯定是类型不同当然不能赋值了,仔细看异常提示,要怎么实现“逆变”呢?其实只需要一个简单的关键字(in)就能解决了

这种在期望传入基类时允许传入派生类对象的特性就是逆变了。

小结

对于协变与逆变只适用于引用类型,因为值类型没法派生新的类型。

显式变化使用in和out关键字只适用于委托和接口,类、结构和方法都不适用。

转载于:https://www.cnblogs.com/liunlls/p/inout.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值