【问题标题】:Type of array index in C#?C#中的数组索引类型?
【发布时间】:2013-05-05 09:22:06
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

标签: c# arrays indexing int byte


【解决方案1】:

原答案:

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

等一下!

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

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

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

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

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

确实这段代码有效:

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

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

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

【讨论】:

  • 在 .NET 4.0 中大于 int.MaxValue 的值失败。
  • 对我来说和 ulong 一起工作!谢谢!
  • 索引必须小于10,因为数组的长度是10,索引从0开始
  • @RamilShavaleev:练习的重点是测试索引的编译时类型是否必须为int,而事实并非如此。
猜你喜欢
  • 2011-12-28
  • 2016-11-07
  • 2018-04-27
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
相关资源
最近更新 更多