代码之家  ›  专栏  ›  技术社区  ›  stovroz

为什么不能在ArrayList之后强制执行.NET 1.1。GetRange?

  •  4
  • stovroz  · 技术社区  · 17 年前

    我想从ArrayList中的值范围创建一个数组,但遇到错误“源数组中至少有一个元素无法转换为目标数组类型”。

    int[] ints = new int[] { 1, 2, 3 };
    ArrayList list = ArrayList.Adapter(ints);
    int[] mints = (int[])list.GetRange(0, 2).ToArray(typeof(int));
    
    4 回复  |  直到 17 年前
        1
  •  3
  •   Jérôme Laban    17 年前

    这是中的一个已知错误。NET 1.1,并已在中修复。NET 2.0。

    GetRange的行为在此版本中被破坏。如果你尝试使用GetRange返回的ArrayList包装器实例的无参数ToArray()列出返回值的内容,你会看到它包含空引用和其他不一致的值。

    here here

        2
  •  0
  •   snarf    17 年前

    这在DotNet 2.0中运行良好,所以我建议从比较反汇编的框架代码开始,看看有什么不同。

    在2.0中,调用ArrayList。Adapters()返回一个ArrayList。IListWrapper(继承自ArrayList),它只是包装一个IList(在您的例子中,是一个int[]类型的数组)。在IListWrapper上调用ToArray会调用IList。底层数组上的CopyTo。

    显然,这必须在1.1中以不同的方式实现,因为按照2.0中的设置方式,它不会失败。

        3
  •  0
  •   Frederik Gheysels    17 年前

    通常,这应该只是工作:

    (int[])list.GetRange(0, 2).ToArray(typeof(int));
    

    你确定你的ArrayList只包含整数,而不包含其他内容吗?

    -arraylist包含除int之外的其他类型的元素。 -ArrayList。适配器方法是问题的根源。

    ArrayList l = new ArrayList ( new int[] {0, 1, 2, 3, 4, 5});
    

    ?

        4
  •  0
  •   Marc Gravell    17 年前

    如果你能使用数组,也许只是 Array.Copy :

        int[] ints = new int[] { 1, 2, 3 };
        int[] mints = new int[2];
        Array.Copy(ints, 0, mints, 0, 2);
    

    或者,看起来你必须

    List<int> 相反)