COVARIANCE协变

  1. IEnumerable<string> strings = new List<string>{"a","b","c"};
  2. IEnumerable<object> objects = strings;

未命名图片.png
~~ ~~
IEnumerable接口,只有输出(返回),
IList<>既有输出也有输入,所以判定当前代码是危险的
还有一种情况,只能输入。Action
未命名图片.png

COVARIANCE,CONTEAVARIANCE,INVARIANCE

Covariance协变,当值作为返回值/out输出
Contracariance逆变,当值作为输入input
Invariance不变,当值即时输入又是输出

  1. public interface IEnumerable<out T> out 协变
  2. public delegate void Action<in T> in 逆变
  3. public interface IList<T>

VARIANCE

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

VARIANCE转换

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

合理的转换

未命名图片.png

不合理的转换

未命名图片.png未命名图片.png未命名图片.png
未命名图片.png

还有一点

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