13

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

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

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

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

谢谢

4

1 回答 1

12

原答案:

是的,它始终是int一个数组访问表达式。其他索引器(例如 in Dictionary<,>)可以具有其他参数类型,但数组访问索引始终为int,如有必要,通过提升(根据您的示例)。

可是等等!

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

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

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

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

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

确实这段代码有效:

string[] array = new string[10];
long index = 10;
string element = array[index];

因此,虽然在您的特定情况下byte提升为int,但访问索引访问并不总是通过int.

即使在 .NET 4.5 中支持“大型数组”,我认为您不能创建包含多个int.MaxValue元素的数组,但我可能是错的。(恐怕我现在没有时间测试它。)

于 2013-05-10T16:15:27.833 回答