我想从ArrayList中的值范围创建一个数组但是得到错误“源数组中至少有一个元素无法转换为目标数组类型”。
为什么以下失败,你会做什么呢?
int[] ints = new int[] { 1, 2, 3 };
ArrayList list = ArrayList.Adapter(ints);
int[] mints = (int[])list.GetRange(0, 2).ToArray(typeof(int));
答案 0 :(得分:3)
这是.NET 1.1中的已知错误,已在.NET 2.0中修复。
此版本中GetRange的行为已被破坏。如果您尝试使用GetRange返回的ArrayList包装器实例的无参数ToArray()列出返回值的内容,您将看到它包含空引用和其他不一致的值。
答案 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});