Tôi có đơn giản mã sau C#:Boxing khi sử dụng Generics trong C#
private Stack<Person> m_stack = new Stack<Person>();
public void Add<T>(T obj)
where T : Person
{
m_stack.Push(obj);
}
này sẽ tạo ra đoạn mã sau 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
Vì vậy, câu hỏi của tôi là ... tại sao đấm bốc? (IL_0008) Tôi có thể hiểu downcasting hoặc thậm chí biên dịch lỗi, nhưng tại sao boxing (Person là một kiểu tham chiếu ...)
Cảm ơn bạn trước!
@ Reed: Vâng, đây là cách tôi giải quyết vấn đề, nhưng tôi đã tò mò tại sao loại tham chiếu được đóng hộp (không có ý nghĩa) ... –
Tôi nghĩ rằng đó là cách triển khai các phương thức chung. Chú ý rằng đó là boxing T, không phải là Person. Bạn không bao giờ boxing/unboxing lớp học của bạn, nhưng nó là một cái gì đó "thêm" mà kết thúc trong đó trong các cuộc gọi phương pháp chung chung. Không chắc chắn tại sao, mặc dù. –