C#中的数组索引类型?

时间:2013-05-10 16:14:38

标签: c# arrays indexing int byte

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

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

T[] myArray = new T[255];
byte index = 2;
T element = myArray[index];

如果没有,使用'byte'类型的索引而不是'int'类型的索引访问数组元素会更快吗?

由于

1 个答案:

答案 0 :(得分:10)

原始回答:

是的,对于数组访问表达式,它总是int。其他索引器(例如在Dictionary<,>中)可以有其他参数类型,但是数组访问索引总是int,必要时通过升级(根据您的示例)。

但等等!

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

  

对于数组访问,element-access的primary-no-array-creation-expression必须是array-type的值。此外,不允许数组访问的参数列表包含命名参数。参数列表中的表达式数必须与数组类型的等级相同,并且每个表达式的类型必须为{{1 }},intuintlong,或者必须可以隐式转换为这些类型中的一种或多种。   评估数组访问的结果是数组元素类型的变量,即由参数列表中的表达式的值选择的数组元素。

     

P [A]形式的数组访问的运行时处理,其中P是数组类型的primary-no-array-creation-expression,A是参数列表,由以下内容组成:步骤进行:

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

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

  •   

确实这段代码有效:

long

因此,在您的特定情况下 时,string[] array = new string[10]; long index = 10; string element = array[index]; 将被提升为byte,访问索引访问并非始终通过int

即使在.NET 4.5中支持“大型阵列”,我也不会认为你可以创建一个超过int元素的数组,但我可能错了。 (我现在没时间测试它,我很害怕。)