簡體   English   中英

失敗演員:IList <T> 到自定義類實現ICollection <T>

[英]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 ,即使它具有相同的成員集。

將繼承視為“是一種”關系。

然后您可以將其視為因為HTMLMenuCollectionList<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>的實現提供給HtmlMenuCollectionAddRange(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM