.net 为什么可以';t dotnet 1.1在ArrayList.GetRange之后被丢弃?
我想从ArrayList中的值范围创建一个数组,但得到错误“源数组中至少有一个元素无法向下转换为目标数组类型” 为什么下面的失败,你会怎么做.net 为什么可以';t dotnet 1.1在ArrayList.GetRange之后被丢弃?,.net,arrays,casting,arraylist,.net-1.1,.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)); 如果您可以使用数组,也许只需Array.Copy: int[] i
int[] ints = new int[] { 1, 2, 3 };
ArrayList list = ArrayList.Adapter(ints);
int[] mints = (int[])list.GetRange(0, 2).ToArray(typeof(int));
如果您可以使用数组,也许只需
Array.Copy
:
int[] ints = new int[] { 1, 2, 3 };
int[] mints = new int[2];
Array.Copy(ints, 0, mints, 0, 2);
或者,看起来您必须创建一个数组并循环/强制转换
(请注意,它在2.0上“按原样”运行良好-尽管您会使用
列表
)这在DotNet 2.0中运行良好,因此我建议从比较分解的框架代码开始,看看有什么不同
在2.0中,调用ArrayList.Adapter()返回一个ArrayList.IListWrapper(它继承自ArrayList),它只包装一个IList(在您的例子中,是int[]类型的数组)。在IListRapper上调用ToArray将调用基础阵列上的IList.CopyTo
显然,这必须在1.1中以不同的方式实现,因为它在2.0中的设置方式是不会失败的。正常情况下,这应该只起作用:
(int[])list.GetRange(0, 2).ToArray(typeof(int));
因为GetRange只返回一个新的ArrayList
您确定ArrayList只包含整数,而不包含其他内容吗
我无法在.NET 1.1中测试它,但我认为:
-您的arraylist包含的元素类型与int不同。
-Adapter方法是问题的根源
另外,为什么不这样初始化ArrayList:
ArrayList l = new ArrayList ( new int[] {0, 1, 2, 3, 4, 5});
?这是.NET 1.1中的一个已知错误,已在.NET 2.0中修复 GetRange的行为在此版本中被破坏。如果尝试使用GetRange返回的ArrayList包装器实例的无参数ToArray()列出返回值的内容,您将看到它包含空引用和其他不一致的值
请参阅2004年12月的帖子和BCL团队博客中的帖子。我认为关键是,发布的代码不应该失败,而且事实上,它确实表明在不同的情况下很可能会出现无法解释的异常。请尝试使用非值类型(例如字符串),这可能是由于框中的某些问题链接已失效。即使在WebArchive中也找不到这些页面。