我正在编写IL静态分析工具,而我很难理解控制泛型类型参数的规则:
拿这个IL(来自IList<T>
interface):
.property instance !T Item(
int32 index
)
{
.get instance !0 System.Collections.Generic.IList`1::get_Item(int32)
.set instance void System.Collections.Generic.IList`1::set_Item(int32, !0)
}
为什么!0
而不是!T
?我认为就VM来说它们是等价的,当你保证拥有这些名字时,使用位置引用似乎很奇怪。
更新:另一个案例来自KeyedCollection.ctor:
IL_0037: newobj instance void class System.Collections.Generic.Dictionary`2<!TKey,!TItem>::'.ctor'(class System.Collections.Generic.IEqualityComparer`1<!0>)
IL_003c: stfld class System.Collections.Generic.Dictionary`2<!0,!1> class System.Collections.ObjectModel.KeyedCollection`2<!0,!1>::dictionary
答案 0 :(得分:4)
在Common Language Infrastructure standard,Partition II - Metadata and File Format,第7.1条“类型”中,它指出:
Type ::= Description
-------- -----------
'!' Generic parameter in a type definition, accessed by index from 0
如此简短的回答:因为它在规范中。
答案很长:这是我的推测,但基本上,大多数IL命令都是基于堆栈的,并且始终使用位置引用作为参数。也就是说,为了维护IL中的常见模式/使用机制,将位置引用用于泛型是有道理的。