为什么不能在ArrayList.GetRange之后抛弃dotnet 1.1?

时间:2009-02-19 21:44:36

标签: .net arrays casting arraylist .net-1.1

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

为什么以下失败,你会做什么呢?

int[] ints = new int[] { 1, 2, 3 };
ArrayList list = ArrayList.Adapter(ints);
int[] mints = (int[])list.GetRange(0, 2).ToArray(typeof(int));

4 个答案:

答案 0 :(得分:3)

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

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

请参阅BCL团队博客中2004年12月herehere的帖子。

答案 1 :(得分:0)

如果你可以使用数组,可能只是Array.Copy

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

或者,看起来你必须创建数组并循环播放。

(对于信息,它在2.0上工作正常“ - 尽管你使用List<int>代替

答案 2 :(得分:0)

这在DotNet 2.0中运行良好,所以我建议首先比较反汇编的Framework代码,看看有什么区别。

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

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

答案 3 :(得分:0)

通常,这应该可行:

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

由于GetRange只返回一个新的ArrayList。

你确定你的ArrayList只包含整数吗?

我无法在.NET 1.1中测试它,但我认为: - 你的arraylist包含其他类型的元素,然后是int。 - ArrayList.Adapter方法是问题的发起者。

另外,为什么不像这样初始化ArrayList:

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