2010-01-10 52 views
2

如果我有以下類:C#連鑄問題

public class MyItems : List<MyItem> 
{ 
.. 
} 

public class MyItem : Item 
{ 
.. 
} 

我怎麼能去鑄造MyItems的實例回落到List<Item>?我試着做一個明確的演員,我得到一個異常。

+0

在C#4,你將能夠投下來到了IEnumerable ,但不IList的。 – 2010-01-10 15:33:03

回答

8

你不能,因爲C#不支持通用的方差(see here for discussion of terminology),即使它沒有,它不會允許這種情況下,因爲如果你能投MyItems到List<Item>,你可以調用Add(someItemThatIsntAMyItem),其中會違反類型安全性(因爲MyItems只能包含MyItem對象,而不是任意的項目)。有關此問題以及C#4中未來更改的其他信息(儘管這些不會影響您的特定情況),請參閱this question(或搜索「c#通用方差」)。

+0

感謝您的解釋。我想出了一個不同的設計來獲得我需要的東西。 – Jeremy 2010-01-10 06:21:45

+0

+1,nice link,ty – 2010-01-10 11:18:38

0

我相信我看到4.0版本即將推出。還不可用。

+3

不會,因爲(a)C#4僅支持代表和接口的變異,而不支持類(嘆氣)和(b),即使它確實支持類的變化,對於'List '來說是不安全的,因爲T是輸入輸出(只有當類型參數只出現在輸入中或者只作爲輸出出現時,方差纔是安全的,而不是如果兩者都出現)。 – itowlson 2010-01-10 06:03:03

0
public class MyList : IList<MyClass> 
{ 
    List<MyClass> _list; 


    //Implement all IList members like so 
    public int IndexOf(MyClass item) 
    { 
     return _list.IndexOf(item); 
    } 


    //Then help the type system a bit with these two static methods. 
    public static implicit operator List<MyClass> (MyList mylist) 
    { 
     return mylist._list; 
    } 

    public static implicit operator MyList (List<MyClass> list) 
    { 
     return new MyList() { _list = list;} 
    }