2010-10-12 50 views
7

Tôi đã gặp sự cố hôm nay và tôi không hoàn toàn chắc chắn lý do tại sao nó không hoạt động.Loại đối tượng đúc trong C#

Mẫu mã sau sẽ sụp đổ:

static void Main(string[] args) 
{ 
    int i32 = 10; 
    object obj = i32; 
    long i64 = (long)obj; 
} 

này sẽ dẫn đến một InvalidCastException. Tại sao cai nay không hoạt động? Là C# không đủ thông minh để biết rằng đối tượng thực sự là loại int?

Tôi đã tìm ra giải pháp thay thế, nhưng tôi tò mò là tại sao mẫu mã ở trên không hoạt động ngay từ đầu.

Cảm ơn, Tim

+1

Tôi lưu ý rằng đây là bản sao của nhiều câu hỏi trước, bao gồm http://stackoverflow.com/questions/3911293 gần đây nhất –

Trả lời

9

Không có dàn diễn viên có sẵn từ một Int32 đóng hộp đến một Int64. Làm một diễn viên trung gian để int nên làm việc, bởi vì trình biên dịch sẵn sàng để tạo ra này:

// verify obj is a boxed int, unbox it, and perform the *statically* 
// known steps necessary to convert an int to a long 
long i64 = (long) ((int)obj); 

nhưng không (giả định) này:

// Find out what type obj *actually* is at run-time and perform 
// the-known-only-at-run-time steps necessary to produce 
// a long from it, involving *type-specific* IL instructions 
long i64 = (long)obj; 

Dưới đây là một blog post bởi Eric Lippert về việc này.

1

Bạn có nghĩa là trình biên dịch hoặc thời gian chạy?

Thời gian chạy đủ thông minh, do đó, nó sẽ ném số InvalidCastException. Trình biên dịch tuy nhiên không thể biết chắc chắn loại đối tượng của bạn là gì, vì bạn đã đóng gói int của bạn.

Loại giá trị kích hoạt quyền anh và unboxing để được coi là đối tượng. Boxing a gói giá trị loại nó bên trong một ví dụ của tham chiếu đối tượng loại.

Vì nó được đóng hộp làm đối tượng nên trình biên dịch sẽ không phàn nàn về nó.

Xem thêm thông tin về boxing và unboxing đây:

http://msdn.microsoft.com/en-us/library/yz2be5wk%28VS.80%29.aspx

3

Check-out this blog post bởi Eric Lippert cho các chi tiết đẫm máu.

Ý chính của nó là rất chậm để trình biên dịch tìm ra (bằng thử và sai, vì object có thể là gì cả) loại nào đã được đóng hộp và có thể đúc an toàn không.

Các vấn đề liên quan