estoy escribiendo una herramienta de análisis estático IL, y estoy teniendo dificultades para comprender las reglas que gobiernan cómo se hace referencia a los parámetros de tipo genérico:genéricos de IL: ¿qué reglas existen para cuándo! T se usa vs! 0?
aprovechar esta IL (del 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)
}
¿Por qué la !0
allí en vez de !T
? Supongo que son equivalentes en lo que respecta a la máquina virtual, parece extraño usar referencias posicionales cuando se tiene la garantía de tener los nombres.
Actualización: un caso adicional, desde 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
no veo esto. ¿Estás seguro de que no es solo un error en tu desensamblador? –
Hm, es definitivamente algo que está generando el desensamblador (en este caso monodis). Mono.Cecil (que parece ser mucho más acorde con los metadatos de los libros) muestra, por ejemplo: stfld System.Collections.Generic.Dictionary'2 System.Collections.ObjectModel.KeyedCollection'2 :: dictionary –
toshok
@HansPassant ¿Qué estás usando para mostrarte el IL? – casperOne