J'ai simple code C#:boxe lors de l'utilisation des médicaments génériques en C#
private Stack<Person> m_stack = new Stack<Person>();
public void Add<T>(T obj)
where T : Person
{
m_stack.Push(obj);
}
Cela produira le code IL suivant:
.method public hidebysig instance void
Add<(ConsoleApplication1.Person) T>(!!T obj) cil managed
{
// Code size 20 (0x14)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldfld class [System]System.Collections.Generic.Stack`1<class ConsoleApplication1.Person> ConsoleApplication1.Pool::m_stack
IL_0007: ldarg.1
IL_0008: box !!T
IL_000d: callvirt instance void class [System]System.Collections.Generic.Stack`1<class ConsoleApplication1.Person>::Push(!0)
IL_0012: nop
IL_0013: ret
} // end of method Pool::Add
Donc, ma question est ... pourquoi la boxe? (IL_0008) Je peux comprendre le downcasting ou même compiler l'erreur, mais pourquoi la boxe (Personne est un type de référence ...)
Merci d'avance!
@ Reed: Oui, voici comment j'ai résolu le problème, mais j'étais curieux de savoir pourquoi le type de référence est encadré (n'a aucun sens) ... –
Je pense que c'est une implémentation du fonctionnement des méthodes génériques. Notez que c'est la boxe T, pas la personne. Vous n'êtes jamais en train de boxer/déballer votre classe, mais c'est quelque chose de "extra" qui finit dans les appels de méthodes génériques. Je ne sais pas pourquoi, cependant. –