【问题标题】:Failed cast: IList<T> to Custom Class implementing ICollection<T>强制转换失败:IList<T> 到实现 ICollection<T> 的自定义类
【发布时间】:2010-09-09 17:15:57
【问题描述】:

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

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

我正在尝试从另一个集合 IList&lt;T&gt; 投射到它。

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

我不知道为什么这不起作用。如果我将IList&lt;T&gt; 转换为ICollection&lt;T&gt; 它工作得很好,但是这样我会得到一个无效的转换异常。我做错了什么?

【问题讨论】:

    标签: c# exception collections casting


    【解决方案1】:

    将继承视为一种“是”关系。

    那么你可以认为它是因为HTMLMenuCollectionList&lt;HTMLMenu&gt;,但不是每个List&lt;HTMLMenu&gt; 都是HTMLMenuCollection(因为List&lt;HTMLMenu&gt; 不继承自HTMLMenuCollection)。

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

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

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

    【讨论】:

      【解决方案2】:

      它不会强制转换,因为 List&lt;HTMLMenu&gt; 根本没有实现 HTMLMenuCollection,即使它具有相同的成员集。

      【讨论】:

      • 好吧,我猜我很密集。 IList 实现了 ICollection 它不应该使用该公共引用来进行强制转换吗?
      • @joshlrogers - 有一个共同的参考是不够的。它们的实现方式不同。 IList 可以实现 HTMLMenuCollection 没有实现的几个特性(从而使它们不兼容)。
      【解决方案3】:

      HTMLMenuCollection 没有实现IListICollection 演员表之所以有效,是因为它们都继承自 ICollection

      此外,您正在从List 向上转换为HTMLMenuCollection,这将不起作用,因为HTMLMenuCollection 没有从List 继承,并且无论向上转换都无法工作,因为编译器会考虑HTMLMenuCollection 拥有比 List 更多的数据(即使没有)。

      将列表传递给构造函数可能更有用,并且将 ICollection 方法的内部实现传递给您在内部存储它的任何容器字段。

      【讨论】:

        【解决方案4】:

        .net 中的转换是在运行时完成的,因此您必须查看实例的类型,而不是变量的声明类型。 htmlMenuList 实例的类型为List&lt;HTMLMenu&gt;,不能强制转换为HTMLMenuCollection,因为List&lt;HtmlMenu&gt; 不是,也不是继承自HtmlMenuCollection

        【讨论】:

          【解决方案5】:

          另一种解决方法是使用通过实现ICollection&lt;HtmlMenu&gt; 提供给HtmlMenuCollectionAddRange(IEnumerable&lt;HtmlMenu&gt;) 方法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-09
            • 1970-01-01
            • 1970-01-01
            • 2014-04-18
            相关资源
            最近更新 更多