Ich bin ein IL statisches Analyse-Tool zu schreiben, und ich habe eine harte Zeit zu verstehen, die Regeln, wie generische Typparameter referenziert aufweisen, sind:IL-Generika - welche Regeln gibt es, wenn! T verwendet wird vs.! 0?
diesen IL nehmen (von den 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)
}
Warum ist die !0
dort statt !T
? Ich vermute, dass sie gleichwertig sind, was die VM betrifft, es scheint nur seltsam, Positionsreferenzen überhaupt zu verwenden, wenn Sie garantiert die Namen haben.
Update: ein zusätzlicher Fall von 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
Ich sehe das nicht. Sind Sie sicher, dass es sich nicht nur um einen Fehler in Ihrem Disassembler handelt? –
Hm, es ist definitiv etwas, was der Disassembler (in diesem Fall Monodis) erzeugt. Mono.Cecil (das anscheinend viel mehr im Buch Metadaten zeigt) zeigt zB: stfld System.Collections.Generic.Dictionary'2 System.Collections.ObjectModel.KeyedCollection'2 :: dictionary –
toshok
@HansPassant Was benutzt du, um dir die IL zu zeigen? – casperOne