我正在学习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
Run Code Online (Sandbox Code Playgroud)
所以我们这里有两个对象,它们看起来是同一类型的.但是一个是实现索引而另一个不是,它怎么可能?
对回复的引用
看完你的评论后,我觉得我对事物有所了解.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);
Run Code Online (Sandbox Code Playgroud)
等等...所以我理解为什么我试图访问sysArray元素的方式是错误的.intArray - > 1个包含多个int的数组sysArray - > 1个类(允许访问许多整数)
从语言的角度来看,sysArray根本不是一个数组,它只是对一个对象的引用(类型为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];
Run Code Online (Sandbox Code Playgroud)
Mar*_*ius 12
铸造会照顾到差异:
t = (sysArray as int[])[4];
Run Code Online (Sandbox Code Playgroud)
你看到两个数组都是类型System.Int32[],因为它们是(这就是为什么这个转换工作).
int被声明为struct在BCL
public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, Equatable<Int32>
Run Code Online (Sandbox Code Playgroud)
虽然Array声明如下:
public abstract class Array : ICloneable, IList, IStructuralComparable, IStructuralEquatable
Run Code Online (Sandbox Code Playgroud)
所以它们实际上并不相同.
如果你想使用索引器从Array获取项目,我认为你需要这样做:
int number = ((IList<int>)sysArray)[4];
Run Code Online (Sandbox Code Playgroud)
原因是如何在Array中声明indexer方法:
Object IList.this[int index] {
get { return GetValue(index); }
set { SetValue(value, index); }
}
Run Code Online (Sandbox Code Playgroud)
由于IList在签名中声明,这意味着您需要强制sysArray转换IList<int>为访问索引器.相反,如果索引器声明如下:
Object this[int index] {
Run Code Online (Sandbox Code Playgroud)
那么是的,你可以sysArray[0];没有任何问题.
| 归档时间: |
|
| 查看次数: |
19301 次 |
| 最近记录: |