C# 中数组索引的类型是什么?
例如,在下面的代码中,在访问数组元素(第三行)之前,索引是否会被转换为 int?
T[] myArray = new T[255];
byte index = 2;
T element = myArray[index];
如果不是,使用“byte”类型的索引访问数组元素是否比“int”类型的索引更快?
Thanks
原答案:
是的,它总是一个int
对于数组访问表达式。其他索引器(例如Dictionary<,>
) 可以有其他参数类型,但数组访问索引始终是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
to int
和来自short
to long
是可能的。如果索引表达式的计算或后续隐式转换导致异常,则不会计算进一步的索引表达式,也不会执行进一步的步骤。
这段代码确实有效:
string[] array = new string[10];
long index = 10;
string element = array[index];
所以虽然在你的具体情况下 the byte
将晋升为int
,访问索引访问并不总是通过int
.
即使 .NET 4.5 中提供了“大型数组”支持,我也不知道think您可以创建一个超过int.MaxValue
元素,但我可能是错的。 (恐怕我现在没有时间测试它。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)