2010-04-16 9 views

Trả lời

17

Không, nó không được đặt trong một đối tượng không được nhập. Đối với mỗi loại giá trị, có một loại tham chiếu đóng hộp trong CLR. Vì vậy, bạn muốn có một cái gì đó như:

public class BoxedInt32 // Not the actual name 
{ 
    private readonly int value; 
    public BoxedInt32(int value) 
    { 
     this.value = value; 
    } 
} 

Đó là loại đóng hộp là không trực tiếp truy cập trong C#, mặc dù nó là trong C++/CLI. Rõ ràng là biết loại ban đầu. Vì vậy, trong C# bạn phải có một loại biên dịch thời gian là object cho biến nhưng điều đó không có nghĩa đó là loại thực tế của đối tượng.

Xem ECMA CLI spec hoặc CLR via C# để biết thêm chi tiết.

+0

intersting, nhờ Jon. Trạng thái C# hiệu quả của Wagner: "Boxing đặt một loại giá trị trong một đối tượng tham chiếu chưa được phân loại". Tôi khá chắc chắn nó cũng nói một cái gì đó để có hiệu lực mà các đối tượng đóng hộp không chứa bất kỳ siêu dữ liệu loại, mặc dù tôi không thể tìm thấy báo giá cụ thể ngay bây giờ. Đó là khi đọc cuốn sách mà câu hỏi đã xảy ra với tôi. – fearofawhackplanet

+0

@fearofawhackplanet: Tôi không muốn nói những lời vào miệng của Bill về chính xác những gì anh ta nói - nhưng đối tượng hộp chắc chắn nhất * không * biết loại ban đầu của nó, bao gồm cả enums. (Hộp một giá trị enum và sau đó sử dụng ToString trực tiếp không có unboxing cho bằng chứng đó :) –

+1

Tôi tin rằng một cuộc biểu tình tốt là điều này. 'long l = 40L; đối tượng o = (đối tượng) l; Console.WriteLine (o.GetType()); 'Trong trường hợp này, System.Int64 được in ra màn hình. Mặc dù 'o' là một đối tượng, kiểu cơ bản vẫn dài. –

6

Câu trả lời của Jon Skeet bao gồm lý do; về cách giải quyết nó, đây là những gì bạn phải làm:

long l = 1; 
object obj = (object)l; 
double d = (double)(long)obj; 

Lý do cho diễn viên kép là như vậy; khi .NET unboxes biến, nó chỉ biết làm thế nào để unbox nó vào kiểu nó được đóng hộp từ (long trong ví dụ của bạn.) Một khi bạn đã unboxed nó và bạn có một long nguyên thủy thích hợp, sau đó bạn có thể bỏ nó đến double hoặc bất kỳ loại nào khác có thể cast từ long.