为什么 System.Collections.ArrayList of int 不会使用 ToArray 转换为枚举类型

本文关键字:ToArray 转换 类型 枚举 Collections System ArrayList of int 为什么 | 更新日期: 2023-09-27 18:35:20

我需要这个:

Plugin.MetaDataType[] fields =
  (Plugin.MetaDataType[]) 
  ((System.Collections.ArrayList) parameters["fields"])
      .ToArray(typeof(Plugin.MetaDataType));

其中 Plugin.MetaDataType 是插件中整数值的公共枚举,参数["fields"] 是 ArrayList,但被视为一个对象。

这将产生异常:"源数组中至少有一个元素无法强制转换为目标数组类型。即使源数组仅包含 int 元素和整数值的枚举。

上面的代码不起作用,但下面的代码可以,即使我认为它应该做完全相同的事情。为什么上面的代码不起作用,但下面的代码可以?

System.Collections.ArrayList al = (System.Collections.ArrayList)parameters["fields"];
Plugin.MetaDataType[] fields = new Plugin.MetaDataType[al.Count];
for (int i = 0; i < al.Count; i++)
{
  fields[i] = (Plugin.MetaDataType)al[i];
}

为什么 System.Collections.ArrayList of int 不会使用 ToArray 转换为枚举类型

可以将int显式强制转换为enum值,但ArrayList.ToArray方法不会将int值强制转换为enum值。

ArrayList必须包含 ArrayList.ToArray 方法的enum类型的值,以允许转换为enum类型。

可以使用 Cast 方法为您执行显式强制转换,而不是自己循环项目:

Plugin.MetaDataType[] fields =
  ((ArrayList)parameters["fields"]).Cast<Plugin.MetaDataType>().ToArray();