Covariance, Contravariance, Invariance
T 既作为输入 又作为输出 是不对的 危险的
- 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
- IEnumerable
to IEnumerable - IEnumerable
to IEnumerable 装箱操作 不是引用转换 - IEnumerable
to IEnumerable 数值转换
- C#的泛型,生产类型(例如List
)可以被编译到dll里。这是因为这种在生产者和产制封闭类型的消费者之间的合成是发生在运行时的。