我想知道: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];
?
答案 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。