2009-02-19 44 views
3

我想从一个ArrayList中的值范围创建一个数组,但得到错误“源数组中至少有一个元素不能被转换为目标数组类型”。为什么不能在ArrayList.GetRange后抛弃dotnet 1.1?

为什么以下方法会失败,您会怎么做?

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

它在2.0的工作 – 2009-02-19 22:16:45

+0

试试它与一个非值类型(例如字符串)它可能是一些问题与拳击 – ShuggyCoUk 2009-02-20 08:29:33

回答

3

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

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

查看帖子从2004年12月herehere,在BCL团队博客。

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>代替)

0

这个作品在DOTNET的2.0精细,所以我建议通过比较反汇编代码框架看起有什么区别。

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

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

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}); 

相关问题