C#数组索引器

时间:2018-10-18 10:28:51

标签: c# arrays casting indexer

我想知道:C#数组索引器是如何实现的? 您可以使用从 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> ulong的基本上每个整数值来索引C#数组,内部实现每次都会简单地转换为通用类型吗?

请明确说明:

sbyte

被翻译成类似的东西

ulong i = 10;
var o = myArray[i];

1 个答案:

答案 0 :(得分:4)

数组索引器的类型为整数,因此可以,该值将转换为int。您可以通过检查IL代码来验证这一点。给出以下示例:

var myArray = new[]{ 1,2,3 };
ulong i = 10;
var o = myArray[i];

它将编译为:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       29 (0x1d)
  .maxstack  3
  .locals init ([0] int32[] myArray,
           [1] uint64 i,
           [2] int32 o)
  IL_0000:  nop
  IL_0001:  ldc.i4.3
  IL_0002:  newarr     [mscorlib]System.Int32
  IL_0007:  dup
  IL_0008:  ldtoken    field valuetype '<PrivateImplementationDetails>'/'__StaticArrayInitTypeSize=12' '<PrivateImplementationDetails>'::E429CCA3F703A39CC5954A6572FEC9086135B34E
  IL_000d:  call       void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array,
                                                                                                      valuetype [mscorlib]System.RuntimeFieldHandle)
  IL_0012:  stloc.0
  IL_0013:  ldc.i4.s   10
  IL_0015:  conv.i8
  IL_0016:  stloc.1
  IL_0017:  ldloc.0
  IL_0018:  ldloc.1
  IL_0019:  conv.ovf.i.un
  IL_001a:  ldelem.i4
  IL_001b:  stloc.2
  IL_001c:  ret
} // end of method Program::Main

使用conv.ovf.i.un指令在IL_0019处进行转换。

  

将评估堆栈顶部的无符号值转换为带符号的本机int,并在溢出时抛出OverflowException。