[英]Failed cast: IList<T> to Custom Class implementing 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>
它可以正常工作,但是這樣我得到了一個無效的強制轉換異常。 我究竟做錯了什么?
它不會List<HTMLMenu>
HTMLMenuCollection
,因為List<HTMLMenu>
根本不實現HTMLMenuCollection
,即使它具有相同的成員集。
將繼承視為“是一種”關系。
然后您可以將其視為因為HTMLMenuCollection
是List<HTMLMenu>
但不是每個List<HTMLMenu>
都是HTMLMenuCollection
(因為List<HTMLMenu>
不從HTMLMenuCollection
繼承)。
您可以從List轉換為IList到ICollection的原因如下:
public class List<T> : IList<T>, ICollection<T> // and more
和
public interface IList<T> : ICollection<T> // and more
另一種解決方法是HtmlMenuCollection
通過ICollection<HtmlMenu>
的實現提供給HtmlMenuCollection
的AddRange(IEnumerable<HtmlMenu>)
方法。
HTMLMenuCollection
不實現IList
。 ICollection
是有效的,因為它們都繼承自ICollection
。
此外,您正在從List
HTMLMenuCollection
轉換為HTMLMenuCollection
,這將無法工作,因為HTMLMenuCollection
不是從List
繼承的,並且無論HTMLMenuCollection
無法工作,因為編譯器會認為HTMLMenuCollection
有更多數據(即使它沒有' t)比List
。
將列表傳遞給構造函數可能更有用,並且ICollection
方法的內部實現只是傳遞給您在內部存儲它的任何容器字段。
在.net中進行的轉換是在運行時完成的,因此您必須查看實例的類型而不是聲明的變量類型。 htmlMenuList
實例的類型是List<HTMLMenu>
,它不能轉換為HTMLMenuCollection
因為List<HtmlMenu>
不是,並且不從HtmlMenuCollection
繼承。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.