【发布时间】:2012-01-30 15:03:09
【问题描述】:
我正在学习 c# 并试图理解它的“面向类型”方面。
所以前几天我需要从一个方法接收一个 System.Array 对象。 然后我尝试使用它的单个对象,所以我尝试用索引来解决它。 编译器不让我说 System.Array 对象不支持索引。
但是 Array 不是所有数组的基类 (System.Array on msdn) 吗?那 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 个对象,它们似乎属于同一类型。 但是一个在实现索引,另一个没有,怎么可能?
对回复的引用
在阅读了您的 cmets 之后,我想我明白了。 int[] 是对象数组。每个对象都是 int32 类型的结构。 Array[] 是一个对象数组。每个对象都是一个 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 根本不是一个数组,它只是对 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];
【问题讨论】:
-
您的问题不清楚。一个 int 是一个对象......所以你所做的没有什么意义。
-
好问题。表明 System.Array 毕竟不只是一个数组......这个世界将走向何方?
标签: c# system.array