【问题标题】:Fixed Size to List固定大小列出
【发布时间】:2009-10-26 14:54:07
【问题描述】:

对于声明的观点,以下是允许的

    IList<string> list= new string[3];
    list.Add("Apple");
    list.Add("Manago");
    list.Add("Grapes");

1) 它编译得很好,但是运行时我收到"Collection was of fixed size" 错误。 当然,集合是按大小动态增长的,为什么编译器会接受这样的声明?

2) 我可以分配给 IList 的不同列表有哪些? 示例

IList<string> fruits=new List<string>();

在这里我将 List 分配给 IList ,各种集合是什么 我可以分配给 IList 的课程吗?

【问题讨论】:

    标签: c# collections


    【解决方案1】:

    这里的根本问题是System.Array 通过实现IList&lt;T&gt; 违反了替换原则。 System.Array 类型具有无法更改的固定大小。 IList&lt;T&gt; 上的 Add 方法旨在向基础集合添加一个新元素并将其大小增加 1。这对于 System.Array 是不可能的,因此它会抛出。

    System.Array 真正想要在这里实现的是只读样式IList&lt;T&gt;。不幸的是,框架中不存在这样的类型,因此它实现了下一个最好的东西:IList&lt;T&gt;

    至于IList&lt;T&gt;可以分配哪些类型的问题,其实有不少,包括:ReadOnlyCollection&lt;T&gt;Collection&lt;T&gt;。清单太长,无法放在这里。查看这一切的最好方法是在反射器中打开IList&lt;T&gt; 并查找IList&lt;T&gt; 的派生类型。

    【讨论】:

    • Dictionary 实现 ICollection,而不是 IList
    【解决方案2】:

    当您调用 list.Add 时,您正试图将一个项目插入到数组的末尾。数组是一个固定大小的集合,因此您无法添加。相反,您必须通过索引器分配条目:

    list[0] = "a";
    list[1] = "b";
    list[2] = "c";
    

    【讨论】:

      【解决方案3】:

      @Jake:实际上 string[] 可以转换为 IList ......但你不能添加到它。

      如果你想预先填充列表,那么你可以使用类似的东西:

      IList<string> list= new string[3] { "Apple", "Mango", "Grapes" };
      

      但是,让它成为 IList 有什么意义呢?你仍然无法添加它。如果它确实是一个固定大小的列表,则将其设为 string[]。否则,按照 Jake 的建议,将其设为 List()。

      【讨论】:

        猜你喜欢
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-13
        相关资源
        最近更新 更多