CILstelem
指令(ECMA 335 [pdf] 中的 III.4.26)被指定为
格式 汇编 格式 说明 A4 <T> stelem typeTok将索引 处的数组元素替换为堆栈上的 值 堆栈转换: ……、数组、索引、值、->……
我不明白typeTok参数的目的是什么。
原始规格
以下是规范中对typeTok的所有提及:
在描述中:
值的类型必须与指令中的typeTok 兼容数组元素。
在“正确性”部分:
typeTok 应为有效
typedef
的typeref
、 或typespec
元数据令牌。在“可验证性”部分:
数组的跟踪类型是
T[]
,对于一些T
;跟踪的value类型是array-element-compatible-with typeTok;
typeTok 与数组元素兼容
T
所以typeTok不用于任何事情;它只需要提供。换句话说,我看到的唯一要求是满足条件的typeTok必须存在。
修改规格
然而,仅仅需要这样一个typeTok的存在就相当于1将上述规范部分更改为
在描述中:
value的类型必须是array-element-compatible-与array的元素类型
在“正确性”部分,删除上述部分。
在“可验证性”部分:
数组的跟踪类型是
T[]
,对于一些T
;跟踪的值类型是数组元素兼容
T
1如果value是aec-with数组的元素类型,那么由于aec-with关系的自反性,可以选择value的类型或数组的元素类型作为满足“原始规范”要求的typeTok ”。相反,如果存在具有给定要求的typeTok,则aec-with关系的传递性立即产生“修改规范”的要求。
那么我错过了什么?为什么typeTok参数在那里(以及为什么stelem.<type>
除了指令之外的指令stelem.ref
甚至存在)?