[英]Type of array index in C#?
C#中的数组索引的类型是什么?
例如,在下面的代码中,索引是否会在访问数组元素(第三行)之前转换为int?
T[] myArray = new T[255];
byte index = 2;
T element = myArray[index];
如果不是,使用'byte'类型的索引而不是'int'类型的索引访问数组元素会更快吗?
谢谢
原始答案:
是的,它总是一个数组访问表达式的int
。 其他索引器(例如在Dictionary<,>
)可以有其他参数类型,但是数组访问索引总是int
,必要时通过提升(根据您的示例)。
可是等等!
实际上,看一下C#5规范的7.6.6.1节,我不太确定:
对于数组访问,element-access的primary-no-array-creation-expression必须是array-type的值。 此外,不允许数组访问的参数列表包含命名参数。参数列表中的表达式数必须与数组类型的等级相同,并且每个表达式必须是
int
,uint
类型,long
,ulong
,或者必须可以隐式转换为这些类型中的一个或多个。 评估数组访问的结果是数组的元素类型的变量,即由参数列表中的表达式的值选择的数组元素。P [A]形式的数组访问的运行时处理,其中P是数组类型的primary-no-array-creation-expression,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];
因此, 在您的特定情况下 , byte
将被提升为int
,访问索引访问并不总是通过int
。
即使.NET 4.5中支持“大型阵列”,我也不认为您可以创建一个包含多个int.MaxValue
元素的数组,但我可能错了。 (我现在没时间测试它,我很害怕。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.