失败转换:IList <T>到实现ICollection <T>的自定义类

jos*_*ers 3 c# collections casting exception

这是我的自定义集合声明.

public interface IMenuCollection<T> : ICollection<T>
public class HTMLMenuCollection: IMenuCollection<HTMLMenu>
Run Code Online (Sandbox Code Playgroud)

我试图从另一个集合中转向它IList<T>.

IList<HTMLMenu> htmlMenuList = new List<HTMLMenu>();
...
HTMLMenuCollection tempColl = (HTMLMenuCollection)htmlMenuList;
Run Code Online (Sandbox Code Playgroud)

我不知道为什么这不起作用.如果我投射IList<T>ICollection<T>它工作得很好,但有了这个我得到一个无效的强制转换异常.我究竟做错了什么?

dtb*_*dtb 5

它没有强制转换,因为它List<HTMLMenu>只是没有实现HTMLMenuCollection,即使它具有相同的成员集.


Jus*_*ner 5

将继承视为"是一种"关系.

然后你可以把它想象成因为HTMLMenuCollection是一个List<HTMLMenu>但不是每个List<HTMLMenu>都是一个HTMLMenuCollection(因为List<HTMLMenu>不继承HTMLMenuCollection).

您可以从List转换为IList到ICollection的原因如下:

public class List<T> : IList<T>, ICollection<T> // and more
Run Code Online (Sandbox Code Playgroud)

public interface IList<T> : ICollection<T> // and more
Run Code Online (Sandbox Code Playgroud)