Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将system.array对象强制转换为int[]字符串或其他类型';s对象_C#_System.array - Fatal编程技术网

C# 将system.array对象强制转换为int[]字符串或其他类型';s对象

C# 将system.array对象强制转换为int[]字符串或其他类型';s对象,c#,system.array,C#,System.array,我正在学习c#,并试图理解c#的“类型导向”方面 所以前几天我需要从一个方法接收一个System.Array对象。 然后我试着处理它的单个对象,所以我试着用索引来处理它。 编译器不让我这么做,说System.Array对象不支持索引 但是数组不是所有数组()的基类吗?int[]如何支持索引而Array[]不支持 下面是一些代码来演示该问题: int[] intArray = {1,2,3,4,5,6,7,8,9,10}; int t; Array sysArray; Console

我正在学习c#,并试图理解c#的“类型导向”方面

所以前几天我需要从一个方法接收一个System.Array对象。 然后我试着处理它的单个对象,所以我试着用索引来处理它。 编译器不让我这么做,说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
所以我们这里有两个物体,看起来是同一类型的。 但是一个是实现索引,另一个不是,怎么可能呢


对答复的提及

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

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
BCL

public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, Equatable<Int32> 
所以它们实际上并不相同

如果您确实希望使用索引器从数组中获取项目,我认为您需要执行以下操作:

int number = ((IList<int>)sysArray)[4];
由于签名中声明了
IList
,这意味着您需要将
sysArray
转换为
IList
,以便访问索引器。相反,如果索引器是这样声明的:

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);

铸造将处理以下差异:

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

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

假设
事件类型
是包含整数值的对象(
对象[]事件类型
):


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

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

你的问题不清楚。int是一个对象…所以你所做的没有什么意义。好问题。显示System.Array毕竟不仅仅是一个数组…这个世界将走向何方,MS?这不是OP的意思。OP询问为什么抽象System.Array类不允许使用索引器语法访问元素:爆炸的是表达式
sysarray[4]
。同样,OP没有询问为什么单个
int
不能被索引。他们在问为什么一个通用的
系统.Array
对象不能被索引。当使用
int[]
时,你实际上使用的是一个C语言结构,即数组。这意味着内置了对索引访问的支持,例如
myarray[23]。本质上,访问
结构数组(int)类
数组
本身就是一个对象,因此当对其使用索引访问时,您不是在使用C语言,而是在使用该类上的任何索引器方法,即
对象IList。此[int index]
。因此,简而言之,每种类型的索引访问器方法完全不同。我不认为数组是“C#语言构造”。使用方括号进行数组元素索引是一种语言构造……数组的存在是CLI的一个基本功能。请参阅ECMA-335:8.9.1阵列类型。至于IList,它包括(正如您所注意到的)索引器
this[int index]
。那么,System.Array如何在不实现所需成员的情况下实现IList
这个[int index]
?嗯,我可以看出您的目的。问题是
数组
通过
对象IList实现了它的索引器。这个[int index]
。如果将其声明为
objectthis[int index]
,则可以执行
sysArray[0]
,而不会出现任何问题。但是由于签名中声明了
IList
,这就产生了不同,并导致我们必须强制转换
sysArray
,才能访问它的索引器。我认为最终的问题是,为什么还要费心于
Array
类呢?谢谢你们,你们的示例和讨论实际上帮助我理解了sysArray到底是什么@贾索尼万斯
    t = (sysArray as int[])[4];
int[] eventTypeIDs = eventTypes.Select(Convert.ToInt32).ToArray();
array.GetValue(1);
array.GetValue(1,2);