Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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#中数组索引的类型?_C#_Arrays_Indexing_Int_Byte - Fatal编程技术网

C#中数组索引的类型?

C#中数组索引的类型?,c#,arrays,indexing,int,byte,C#,Arrays,Indexing,Int,Byte,C#中数组索引的类型是什么 例如,在下面的代码中,在访问数组元素(第三行)之前,是否将索引转换为int 如果不是,使用“byte”类型的索引访问数组元素是否比使用“int”类型的索引更快 谢谢原始答案: 是的,数组访问表达式总是int。其他索引器(例如,在字典中)可以有其他参数类型,但数组访问索引始终是int,如果需要,可以通过升级(根据您的示例) 等等 实际上,看看C#5规范的第7.6.6.1节,我不太确定: 对于数组访问,元素访问的主无数组创建表达式必须是数组类型的值。此外,数组访问的参数列

C#中数组索引的类型是什么

例如,在下面的代码中,在访问数组元素(第三行)之前,是否将索引转换为int

如果不是,使用“byte”类型的索引访问数组元素是否比使用“int”类型的索引更快


谢谢

原始答案:

是的,数组访问表达式总是
int
。其他索引器(例如,在
字典中
)可以有其他参数类型,但数组访问索引始终是
int
,如果需要,可以通过升级(根据您的示例)

等等

实际上,看看C#5规范的第7.6.6.1节,我不太确定:

对于数组访问,元素访问的主无数组创建表达式必须是数组类型的值。此外,数组访问的参数列表不允许包含命名参数。参数列表中表达式的数量必须与数组类型的秩相同,并且每个表达式的类型必须为
int
uint
long
ulong
,或必须隐式转换为这些类型中的一个或多个。 对数组访问进行求值的结果是数组元素类型的变量,即由参数列表中表达式的值选择的数组元素

形式为p[A]的数组访问的运行时处理包括以下步骤,其中p是数组类型的主要无数组创建表达式,A是参数列表:

  • p
    进行评估。如果此评估导致异常,则不会执行进一步的步骤

  • 参数列表的索引表达式按从左到右的顺序求值。在对每个索引表达式求值之后,执行到以下类型之一的隐式转换(§6.1):
    int
    uint
    long
    ulong
    。选择此列表中存在隐式转换的第一个类型。例如,如果索引表达式的类型为
    short
    ,则执行到
    int
    的隐式转换,因为从
    short
    int
    以及从
    short
    long
    的隐式转换是可能的。如果对索引表达式或后续隐式转换的求值导致异常,则不会对进一步的索引表达式求值,也不会执行进一步的步骤

事实上,这一准则是有效的:

string[] array = new string[10];
long index = 10;
string element = array[index];
因此,虽然在您的特定情况下,
字节
将被提升为
int
,但访问索引并不总是通过
int
进行


即使使用.NET4.5中的“大数组”支持,我也不认为您可以创建一个包含超过
int.MaxValue
元素的数组,但我可能错了。(恐怕我现在没有时间去测试。)

我很惊讶以前似乎没有人问过C#这个问题。为了完整性,在C++()和“C99”()中提及它的对应物可能是有意思的。在.NET 4中,值大于In .Max值失败。谢谢索引必须小于10,因为数组长度为10,索引从0@RamilShavaleev:练习的重点是测试索引的编译时类型是否必须是
int
,而不是。
string[] array = new string[10];
long index = 10;
string element = array[index];