C# 泛型简介 03

2019-08-20  本文已影响0人  JeetChan

声明

本文内容来自微软 MVP solenovex 的视频教程——真会C#? - 第3章 泛型简介(完结),大致和第 3 课—— 3.9 协变、逆变、不变 对应。可在 GitHub 中查看 C# 视频教程的配套PPT

本文主要包括以下内容:

  1. 协变,逆变,不变

协变,逆变,不变

Covariance 协变,当值作为返回值/out 输出。

Contravariance 逆变,当值作为输入 input。

Invariance 不变,当值既是输入又是输出。

public interface IEnumerable<out T>
public delegate void Action<in T>
public interface IList<T>

Variance

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

Variance 转换

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

合理的转换

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

IEnumerable<string> to IEnumerable<object>
IEnumerable<string> to IEnumerable<IConvertible>
IEnumerable<IDisposable> to IEnumerable<object>

不合理的转换

IEnumerable<object> to IEnumerable<string>
IEnumerable<string> to IEnumerable<Stream>
IEnumerable<int> to IEnumerable<IConvertible>
IEnumerable<int> to IEnumerable<long>

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

C# 泛型

参考

Generics (C# Programming Guide)
Generic Methods (C# Programming Guide)
Generic Classes (C# Programming Guide)

上一篇下一篇

猜你喜欢

热点阅读