c# - C# 数组索引器
问题描述
我想知道:C# 数组索引器是如何实现的?ulong
您可以使用从to的每个整数值来索引 C# 数组,sbyte
内部实现是否每次都简单地转换为通用类型?
需要明确的是:
ulong i = 10;
var o = myArray[i];
被翻译成类似的东西:
ulong i =10;
var o = myArray[(int /*or whatver is the default type used*/)i];
?
解决方案
数组索引器的类型是整数,所以是的,该值将转换为 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
转换发生在IL_0019
指令conv.ovf.i.un
下。
将评估堆栈顶部的无符号值转换为有符号的本机 int,在溢出时抛出 OverflowException。
推荐阅读
- java - 如何在春季重试中打印延迟序列
- python - 使用 pandas python 合并具有条件的数据框
- timer - Arduino 的 micros() 方法需要 500 多个周期才能在 Nano 33 BLE Sense 上执行
- python - Django内联表单集不保存默认值
- reactjs - 每个应用实例仅调用一次 React useEffect
- python - 如何在烧瓶中播放上传的音频文件
- amazon-web-services - 在 EMR 上设置 Apache Sedona
- python - 如何在字典中添加新条目?
- node.js - 文件名包含括号时的 AWS S3 CLI 错误
- c# - 使自定义 msbuild 任务依赖于 nuget 的可执行文件