铸造两个不同的对象数组

Casting two different object arrays

我有两个对象数组。一个人通过从 A[] 到 object[] 的协方差隐式转换,然后毫无问题地显式转换回来。另一个是一个对象列表,我向其中添加了一些 A 并制作了一个对象 [],我尝试从中转换为 A[]。

public class A {}

object[] o = new A[]{new A(), new A()};
A[] a_2 = (A[])o;

List<object> lo = new List<object>();
lo.Add(new A());
lo.Add(new A());
A[] a_1 = (A[])lo.ToArray();

第二个测试失败 System.InvalidCastException: Cannot cast from source type to destination type. 我可以看出这可能会引发异常,因为我们可以向对象列表添加任何内容,而使用隐式转换,原始数组必须全部为 As .

如果列表包含所有 As as if A 在编译时未知,是否有任何方法可以完成第二次转换?为什么第二个抛出异常,因为从表面上看,它们都只是 object[] 到 A[] 的转换?

不,没有办法完成第二次投射。数组差异取决于数组对象本身的实际类型,而不是其内容。由于数组类型,您可以将 A[] 转换为 object[] 数组。请注意,如果您尝试将非 A 对象添加到 A[] 转换为 object[],那在 运行 时仍然会失败,因为数组仍然是 A[].

如果你想要一个 A[] 对象,而你只有一个 object[] 对象,你将需要创建新的 A[] 对象并将值从原始数组复制到新的。

使用OfType<T>函数。

...
var lo = new List<object> {new A(), new A()};
var cast = lo.OfType<A>().ToArray();
...