C#中数组索引的类型是什么?
例如,在下面的代码中,索引是否会在访问数组元素(第三行)之前转换为 int?
T[] myArray = new T[255];
byte index = 2;
T element = myArray[index];
如果不是,使用“byte”类型的索引访问数组元素是否比“int”类型的索引更快?
谢谢
原答案:
是的,它始终是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
,因为从short
toint
和 fromshort
to的隐式转换long
是可能的。如果索引表达式的求值或随后的隐式转换导致异常,则不再求值索引表达式,也不会执行进一步的步骤。
确实这段代码有效:
string[] array = new string[10];
long index = 10;
string element = array[index];
因此,虽然在您的特定情况下将byte
提升为int
,但访问索引访问并不总是通过int
.
即使在 .NET 4.5 中支持“大型数组”,我认为您不能创建包含多个int.MaxValue
元素的数组,但我可能是错的。(恐怕我现在没有时间测试它。)