Boxeo y unboxing con genéricos

La forma .NET 1.0 de crear una colección de enteros (por ejemplo) era:

ArrayList list = new ArrayList();
list.Add(i);          /* boxing   */
int j = (int)list[0]; /* unboxing */

La penalidad de usar esto es la falta de seguridad de tipo y rendimiento debido al boxeo y al desempaquetado.

La forma .NET 2.0 es usar genéricos:

List<int> list = new List<int>();
list.Add(i);
int j = list[0];

El precio del boxeo (a mi entender) es la necesidad de crear un objeto en el montón, copiar el entero asignado a la pila al nuevo objeto y viceversa para el desempaquetado.

¿Cómo supera esto el uso de genéricos? ¿El entero asignado a la pila permanece en la pila y se señala desde el montón (supongo que este no es el caso debido a lo que sucederá cuando salga del alcance)? Parece que todavía hay una necesidad de copiarlo en otro lugar fuera de la pila.

¿Qué pasa en realidad?

Respuestas a la pregunta(6)

Su respuesta a la pregunta