假設現在有兩個類—— 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/