2012-04-30 27 views
6

Mã dưới đây thất bại tại việc gần đây nhất:C# int- hoặc đối tượng để đôi đúc lỗi giải thích

static void Main(string[] args) 
{ 
    int a = 5; 
    object b = 5; 

    System.Diagnostics.Debug.Assert(a is int && b is int); 

    double x = (double)a; 
    double y = (double)b; 
} 

Nếu cả a và b là int, nguyên nhân của lỗi này là gì?

+0

bản sao có thể có của [Truyền giá trị được đóng hộp] (http://stackoverflow.com/questions/5312731/casting-a-boxed-value) – Brian

Trả lời

15

Unboxing đòi hỏi chính xác loại - bạn có thể làm điều này thay vì:

double y = (double)(int)b; 
+0

Thú vị. Cảm ơn! – digdig

20

Đây là một câu hỏi rất thường gặp. Xem http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx để được giải thích.


Snippet:

tôi nhận được một số hợp lý của các câu hỏi về các nhà điều hành C# đúc. Câu hỏi thường gặp nhất tôi nhận được là:

short sss = 123; 
object ooo = sss;   // Box the short. 
int iii = (int) sss;   // Perfectly legal. 
int jjj = (int) (short) ooo; // Perfectly legal 
int kkk = (int) ooo;   // Invalid cast exception?! Why? 

Tại sao? Vì một hộp T chỉ có thể được đóng hộp thành T. (*) Sau khi được mở hộp, nó chỉ là một giá trị có thể truyền như bình thường, do đó, việc truyền đôi hoạt động tốt.

(*) Hoặc Nullable<T>.

0

a là một int, nhưng b là một tham chiếu đến một đối tượng mà là một int - đó là những gì được gọi là một int đóng hộp. Họ là hai điều khác nhau, do đó các hành vi khác nhau.

1

Truyền ngầm là hoạt động biên dịch. Không thể cho b loại object.

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