Tengo el siguiente código C# sencilla:boxeo cuando se utilizan los genéricos en C#
private Stack<Person> m_stack = new Stack<Person>();
public void Add<T>(T obj)
where T : Person
{
m_stack.Push(obj);
}
Esto producirá el siguiente código IL:
.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
Así que mi pregunta es ... ¿por qué el boxeo? (IL_0008) Puedo entender downcasting o incluso error de compilación, pero ¿por qué el boxeo (persona es un tipo de referencia ...)
Gracias de antemano!
@ Reed: Sí, así es como resolví el problema, pero tenía curiosidad por saber por qué el tipo de referencia está encasillado (no tiene ningún sentido) ... –
Creo que es una implementación de cómo funcionan los métodos genéricos. Tenga en cuenta que es boxeo T, no persona. Nunca está boxeo/unboxing su clase, pero es algo "extra" que termina en allí en las llamadas a métodos genéricos. Sin embargo, no estoy seguro de por qué. –