将 System.array 对象强制转换为 int[] 字符串或其他类型的对象

本文关键字:对象 字符串 其他 类型 array System 转换 int | 更新日期: 2023-09-27 18:19:16

我正在学习c#并试图理解它的"面向类型"方面。

所以前几天我需要从一个方法接收一个 System.Array 对象。然后我尝试使用它的各个对象,所以我尝试用索引来解决它。编译器不让我,说System.Array对象不支持索引。

但是 Array 不是所有数组的基类(msdn 上的 System.Array(吗?int[] 为什么支持索引而 Array[] 不支持?

下面是一些代码来演示该问题:

int[] intArray = {1,2,3,4,5,6,7,8,9,10};
int t;
Array sysArray;       
Console.WriteLine("{0}", intArray.GetType().ToString()); // output: System.Int32[]
sysArray = Array.CreateInstance(typeof(int), 10);
Console.WriteLine("{0}", sysArray.GetType().ToString()); // output: System.Int32[]
sysArray = intArray; //compiles ok
//t = sysArray[4]; This line produces error Error 2 Cannot apply indexing with [] to an
// expression of type 'System.Array'
//t = intArray[4]; This line compiles ok

所以我们这里有 2 个对象,它们似乎是同一类型的。但是一个正在实现索引,另一个没有,这怎么可能?


对答复的引用

看完你的评论后,我想我明白了。int[] 是 和 对象数组。每个对象都是 int32 类型的结构。数组[] 是一个对象数组。每个对象都是 Array 类型的类。含义:数组数组。正如我可以在以下代码中显示的:

Array[] sysArrayOfArray = new Array[SIZE_OF_THE_MOTHER_ARRAY];
sysArrayOfArray[0] = Array.CreateInstance(typeof(int),SIZE_OF_FIRST_CHILD_ARRAY);
sysArrayOfArray[1] = Array.CreateInstance(typeof(int),SIZE_OF_FIRST_SECOND_ARRAY);

等等...所以我明白为什么我尝试访问 sysArray 元素的方式是错误的。intArray -> 1 个由许多整数组成的数组sysArray -> 1 个类(授予对许多整数的访问权限(

从语言的角度来看,sysArray 根本不是一个 Array,它只是对 1 个对象(类型为 System.Array(的引用。

(很抱歉重复了一下,但它确实有助于在我的脑海中设置事情(

感谢大家指导理解这种差异。

关于解决方案..我正在寻找并为我工作的最佳方法:

 Array sysArray = Array.CreateInstance(typeof(int),3);
 int[] intArray = new int[3];
 int one, ten, hundred;
 sysArray.SetValue(1, 0);
 sysArray.SetValue(10,1);
 sysArray.SetValue(100,2);
 intArray = (int[])sysArray;// works, but forces me to create a new reference
 one = ((int[])sysArray)[0];// works and is exactly what i was looking for...
 ten = ((int[])sysArray)[1];
 hundred = ((int[])sysArray)[2];    

将 System.array 对象强制转换为 int[] 字符串或其他类型的对象

铸造将处理差异:

    t = (sysArray as int[])[4];

您看到两个数组都是 System.Int32[] 类型,因为它们是(这就是此强制转换工作的原因(。

intBCL中声明为struct

public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, Equatable<Int32> 

虽然Array是这样声明的:

public abstract class Array : ICloneable, IList, IStructuralComparable, IStructuralEquatable

所以它们实际上并不相同。

如果您确实想使用索引器从 Array 中获取项目,我认为您需要这样做:

int number = ((IList<int>)sysArray)[4];

原因是由于索引器方法在 Array 中的声明方式:

Object IList.this[int index] { 
  get { return GetValue(index); }
  set { SetValue(value, index); } 
}

由于IList是在签名中声明的,这意味着需要将sysArray强制转换为IList<int>才能访问索引器。相反,如果索引器是这样声明的:

Object this[int index] {

那么是的,您可以毫无问题地做sysArray[0];

您必须查看每个对象实现的接口。 Array实现提供对象索引器的System.Collections.IList,而int不提供IList实现。

System.Array 是一个抽象的基类。 微软文档说明了一切...

Provides methods for creating, manipulating, searching, and sorting arrays, thereby
serving as the base class for all arrays in the common language runtime.

System.Array 不提供索引器的实现。

对你有用的是这个...

int[] sysArray = (int[])Array.CreateInstance(typeof(int), 10);

假设eventTypes对象包含整数值(object[] eventTypes(:

int[] eventTypeIDs = eventTypes.Select(Convert.ToInt32).ToArray();

您可以使用 GetValue 函数读取 Array 的值。

array.GetValue(1);
array.GetValue(1,2);