2011-03-06 220 views
2
public class A {} 

public class B : A {} 

現在什麼是最好的方式來獲得這方面的工作泛型類型多態性

List<A> a; 
List<B> b = new List<B>(); 
a = b; // throw Cannot convert List<B> to List<A> 

謝謝

+0

參見:http://stackoverflow.com/questions/2184551/difference-between-covariance-contra-variance – 2011-03-06 23:01:33

回答

5

List<T>類型不支持協方差,所以你不能直接分配給List<B>List<A>即使B本身可直接分配給A。你需要做一個通過列表b,轉換和添加項目列表a隨時隨地。該ConvertAll方法是做到這一點的快捷方法:

List<B> b = new List<B>(); 
// ... 
List<A> a = b.ConvertAll(x => (A)x); 
+0

什麼ConvertAll的行爲差異(X = >(A)x)和Select(x =>(A)x)? – Proviste 2011-03-07 10:08:50

+1

'ConvertAll'是'List '類中的一個實例方法,並從現有列表創建一個新的'List '。 'Select'是一種擴展方法,它作用於任何「IEnumerable 」,並創建一個新的「IEnumerable 」序列。使用'ConvertAll'應該比* Select稍快*,因爲它可以進行一些優化(例如,它可以在開始時將目標數組分配到正確的長度,而不需要動態調整大小,而且它可以直接訪問源列表的底層數組,而不需要實例化和使用單獨的枚舉器對象)。 – LukeH 2011-03-07 10:18:39