Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Array Indexer

I was wondering: how is the C# array indexer implemented? You can index a C# array with basically every integer value from ulong to sbyte, does the internal implementation simply casts to a common type every time?

To be clear will this:

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

be translated into something like:

ulong i =10;
var o = myArray[(int /*or whatver is the default type used*/)i];

?

like image 404
Alakanu Avatar asked Jun 29 '26 04:06

Alakanu


1 Answers

The type of an array indexer is integer, so yes, the value will be converted to int. You can verify this by examining the IL code. Given this example:

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

This will compile into:

.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

The conversion happens at IL_0019 with conv.ovf.i.un instruction.

Converts the unsigned value on top of the evaluation stack to signed native int, throwing OverflowException on overflow.

like image 78
Selman Genç Avatar answered Jun 30 '26 18:06

Selman Genç



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!