C#中的数组索引类型?

Cas*_*sto 11 c# arrays indexing int byte

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

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

T[] myArray = new T[255];
byte index = 2;
T element = myArray[index];
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Jon*_*eet 10

原始答案:

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

可是等等!

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

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

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

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

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

确实这段代码有效:

string[] array = new string[10];
long index = 10;
string element = array[index];
Run Code Online (Sandbox Code Playgroud)

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

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