2010-09-09 76 views
3

這是我的自定義收集聲明。失敗演員:IList <T>到自定義類執行ICollection <T>

public interface IMenuCollection<T> : ICollection<T> 
public class HTMLMenuCollection: IMenuCollection<HTMLMenu> 

我想從另一個集合IList<T>投給它。

IList<HTMLMenu> htmlMenuList = new List<HTMLMenu>(); 
... 
HTMLMenuCollection tempColl = (HTMLMenuCollection)htmlMenuList; 

我不知道爲什麼這是不行的。如果我投IList<T>ICollection<T>它工作得很好,但與此我得到一個無效的轉換異常。我究竟做錯了什麼?

回答

5

將繼承看作是'是'的關係。

然後,你可以把它看成是因爲HTMLMenuCollectionList<HTMLMenu>但並不是每個List<HTMLMenu>HTMLMenuCollection(因爲List<HTMLMenu>不從HTMLMenuCollection繼承)。

,你可以從列表到的IList到ICollection的投其原因如下:

public class List<T> : IList<T>, ICollection<T> // and more 

public interface IList<T> : ICollection<T> // and more 
5

它沒有投射,因爲List<HTMLMenu>根本沒有執行HTMLMenuCollection,即使它具有相同的一組成員。

+0

好吧,我正在密集我猜。 IList 實現ICollection 它不應該使用該共同的參考來進行演員? – joshlrogers 2010-09-09 17:19:26

+0

@joshlrogers - 有一個共同的參考是不夠的。它們的實施方式不同。 IList可以實現HTMLMenuCollection不實現的幾個功能(從而使它們不兼容)。 – 2010-09-09 17:22:51

0

HTMLMenuCollection沒有實現IListICollection演員工作,因爲他們都從ICollection繼承。

此外,你從List上溯造型到HTMLMenuCollection,這將無法工作,因爲HTMLMenuCollection不是從List繼承,也不管升頻不能工作,因爲編譯器會考慮HTMLMenuCollection有更多的數據(甚至如果不是)比List

將列表傳遞給構造函數可能更有用,並且ICollection方法的內部實現只是傳遞給您在內部存儲它的任何容器字段。

0

.net中的投影是在運行時完成的,因此您必須查看實例的類型而不是變量的聲明類型。 htmlMenuList實例的類型爲List<HTMLMenu>,由於List<HtmlMenu>不是,也不能從HtmlMenuCollection繼承,因此無法將其轉換爲HTMLMenuCollection

0

另一種解決方法可能是使用AddRange(IEnumerable<HtmlMenu>)方法,該方法通過執行ICollection<HtmlMenu>而提供給HtmlMenuCollection