假设现在有两个类—— A 和 B ,其中 A 是 B 的子类。将 A(子类)的引用转换为 B(父类)的引用是很普通的事,在任何编程语言中都不存在问题。但是将 List<A> (子类的容器)转换成 List<B> (父类的容器)就不是那么简单的事情了,因为 List<B> 并不是 List<A> 的父类。
不过从 .NET 4.0起,我们已经可以在 C# 中写
List<Base> baseList = new List<Derived>();
这样的代码了。这是因为 .NET 4.0 支持 C# 的变体范型(variance for generic type parameters)特性。关于其具体信息可以在网上搜索“C# 协变 逆变”。协变的英文是 Covariance,逆变的英文是 Contravariance。
如果想在 Unity 中使用这个特性的话,就要将 Unity 用的 .NET 运行时改为4.0以上。方法是将 Project Setting -> Player -> Scripting Runtime Version 改成 Experimental (.NET 4.6 Equivalent)。
本文在我的独立博客上的地址:http://zxtechart.com/2018/09/02/cast-list-a-to-list-b/