CSharp Basic Tutorial Chapter-3-13 协变 逆变 不变


Covariance, Contravariance, Invariance

demo1
demo2
demo3

T 既作为输入 又作为输出 是不对的 危险的
demo4
demo5
demo6

  • Covariance 协变,当值作为返回值/out 输出
  • Contravariance 逆变,当值作为输入 input
  • Invariance 不变,当值既是输入又是输出
  • public interface IEnumerable
  • public delegate void Action
  • public interface IList

variance

  • variance 只能出现在接口和委托里。

Variance 转换

  • 涉及到variance的转换就是variance转换。
  • Variance转换是引用转换的一个例子。引用转换就是指,你无法改变其底层的值,只能改变编译时类型。
  • identity conversion,对CLR而言从一个类型转化到相同的类型 本体转换

合理的转换

  • 如果从A到B的转换是本体转换或者隐式引用转换,那么从IEnumerable到IEnumerable的转换就是合理的:
  • IEnumerable to IEnumerable
  • IEnumerable to IEnumerable:
  • IEnumerable to IEnumerable

不合理的转换

  • IEnumerable to IEnumerable
  • IEnumerable to IEnumerable
  • IEnumerable to IEnumerable 装箱操作 不是引用转换
  • IEnumerable to IEnumerable 数值转换

demo7
demo8
demo9
demo10
demo11

  • C#的泛型,生产类型(例如List)可以被编译到dll里。这是因为这种在生产者和产制封闭类型的消费者之间的合成是发生在运行时的。

文章作者: Chaoqiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chaoqiang !
评论
 上一篇
CSharp Basic Tutorial Chapter-4-1 委托(上) CSharp Basic Tutorial Chapter-4-1 委托(上)
Delegates 委托 委托是一个对象,它知道如何调用一个方法 委托类型和委托实例 委托类型定义了委托实例可以调用的那类方法,具体来说,委托类型定义了方法的返回类型和参数。 例子 委托实例把方法赋值给委托变量的时候就创建了委托实例。
下一篇 
CSharp Basic Tutorial Chapter-3-12 泛型约束  子类  自引用  静态数据  转换 CSharp Basic Tutorial Chapter-3-12 泛型约束 子类 自引用 静态数据 转换
泛型的约束 默认情况下,泛型的类型参数(parameter)可以是任何类型的。 如果只允许使用特定的类型参数(argument),就可以指定约束。 泛型约束 例子 泛型约束T是不可空的值类型 这个泛型代表了可空值类型 T有一个无参的构
  目录