C# 泛型-协变、逆变

1. 基本概念

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

公式:

          协变:IFoo = IFoo;

          逆变:IBar =  IBar;

2. 协变(Covariance)

1) out关键字

     对于泛型类型参数,out 关键字可指定类型参数是协变的。 可以在泛型接口和委托中使用 out 关键字。[MSDN]

备注:泛型委托的协变原理也是一样的。

2) 什么是协变?

协变就是对具体成员的输出参数进行一次类型转换,且类型转换的准则是 “里氏替换原则”。

3. 逆变(Contravariance)

 1) in关键字

     对于泛型类型参数,in 关键字可指定类型参数是逆变的。 可以在泛型接口和委托中使用 in 关键字。[MSDN]

    备注:泛型委托的逆变原理也是一样的。

2) 什么是逆变?

逆变就是对具体成员的输入参数进行一次类型转换,且类型转换的准则是 “里氏替换原则”。

4. 总结

1)协变、逆变 为什么只能针对泛型接口或者委托?而不能针对泛型类?

      因为它们都只能定义方法成员(接口不能定义字段),而方法成员在创建对象的时候是不涉及到对象内存分配的,所以它们是类型(内存)安全的。

      为什么不针对泛型?因为泛型类是模板类,而类成员是包含字段的,不同类型的字段是影响对象内存分配的,没有派生关系的类型它们是不兼容的,也是内存不安全的。

2)协变、逆变 为什么是类型安全的?

      本质上是里氏替换原则,由里氏替换原则可知:派生程度小的是派生程度大的子集,所以子类替换父类的位置整个程序功能都不会发生改变。

原文链接[C# 协变、逆变]

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值