如果我有以下類:C#連鑄問題
public class MyItems : List<MyItem>
{
..
}
public class MyItem : Item
{
..
}
我怎麼能去鑄造MyItems的實例回落到List<Item>
?我試着做一個明確的演員,我得到一個異常。
如果我有以下類:C#連鑄問題
public class MyItems : List<MyItem>
{
..
}
public class MyItem : Item
{
..
}
我怎麼能去鑄造MyItems的實例回落到List<Item>
?我試着做一個明確的演員,我得到一個異常。
你不能,因爲C#不支持通用的方差(see here for discussion of terminology),即使它沒有,它不會允許這種情況下,因爲如果你能投MyItems到List<Item>
,你可以調用Add(someItemThatIsntAMyItem)
,其中會違反類型安全性(因爲MyItems只能包含MyItem對象,而不是任意的項目)。有關此問題以及C#4中未來更改的其他信息(儘管這些不會影響您的特定情況),請參閱this question(或搜索「c#通用方差」)。
感謝您的解釋。我想出了一個不同的設計來獲得我需要的東西。 – Jeremy 2010-01-10 06:21:45
+1,nice link,ty – 2010-01-10 11:18:38
我相信我看到4.0版本即將推出。還不可用。
不會,因爲(a)C#4僅支持代表和接口的變異,而不支持類(嘆氣)和(b),即使它確實支持類的變化,對於'List
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;}
}
在C#4,你將能夠投下來到了IEnumerable- ,但不IList的
- 。 –
2010-01-10 15:33:03