2013-06-19 92 views
4

我確定我在這裏丟失了某些東西,但是這不起作用的任何特定原因?將通用列表傳遞給ObservableCollection構造函數

public ObservableCollection<object> ItemCollection { get; set; } 

private void SetListData<T>(List<T> MyList) 
{ 
    ItemCollection = new ObservableCollection<object>(MyList); 
} 

T有一些價值,這將無法正常工作?我的數字對象的集合將覆蓋每一個案件,但似乎並不:

錯誤2參數1:不能從 「System.Collections.Generic.List <T>」轉換爲 「System.Collections.Generic.List <object>

更改屬性的簽名會導致整個一套新的問題,所以將其更改爲:

ItemCollection = new ObservableCollection<T>(MyList); 

似乎並不LIK一個很好的解決方案。任何人都可以告訴我爲什麼我的原始代碼不起作用,並且如果有任何簡單的修復?

回答

4

你有兩個選擇:

private void SetListData<T>(List<T> MyList) where T : class 

ItemCollection = new ObservableCollection<object>(MyList.Cast<object>()); 

如果你有一個已知參考的List<T>類型,它可以工作,即使類型參數不是object

var list = new List<string>(); 
var observable = new ObservableCollection<object>(list); 

但是在這種情況下,您使用的通用參數不是已知的參考類型;它可能是一個值類型/結構。這些可以被「裝箱」爲objects,但不是固有的objects。因此,您必須將該參數限制爲始終爲參考類型,或者允許任何類型爲T,並在該方法的主體內執行顯式強制轉換爲object

+0

我認爲只是代碼片段沒有解釋沒有什麼用處。 – svick

+0

出於好奇,爲什麼這個工作'where T:class',我想它阻止我傳遞一個接口? –

+0

如果你有一個已知類型'int'的列表,它將不起作用(至少不是沒有'Cast')。 – svick

1

問題是「T」不是「對象」,儘管「T」繼承了「對象」。通用列表中的類型必須相同。

你最好的解決辦法如下:

​​
1

你快到了。只有當T是參考類型時,List<T>纔可轉換爲IEnumerable<object>(感謝協方差)。因此,限制T成爲參考類型將工作:

private void SetListData<T>(List<T> MyList) where T : class 
{ 
    ItemCollection = new ObservableCollection<object>(MyList); 
} 
+0

我想你錯過了一些東西。您發佈的代碼與OP發佈的非工作代碼相同。 – Jay

+0

@Jay謝謝,你是對的。現在修復。 – svick