2011-10-28 44 views
6

này hoạt động như mong đợi:Tại sao tính năng định kiểu này gây ra lỗi?

byte b = 7; 
var i = (int)b; 

Trong khi điều này ném một InvalidCastException:

byte b = 7; 
object o = b; 
var i = (int)o; 

Tại sao các diễn viên thất bại từ một object khi loại cơ bản vẫn là byte?

+3

Câu hỏi này khám phá điều này: http://stackoverflow.com/questions/5588073/generics-casting-and-value-types-why-is-this-illegal - đặc biệt là câu trả lời của Eric Lippert là đọc tốt. –

+0

@MattGreer Điều đó làm chính xác câu trả lời của tôi tự hỏi. – jelbourn

Trả lời

6

byte có chuyển đổi rõ ràng thành int, nhưng object thì không.

Nếu bạn nói với trình biên dịch các objectthực sự một byte, sau đó nó sẽ lại một lần nữa cho phép bạn đúc một cách rõ ràng để int.

byte b = 7; 
object o = b; 
var i = (int)((byte)o); 

Tài liệu tham khảo:

Casting and Type Conversions
byte

+0

ah, chỉ muốn trả lời rằng: P – Rob

0

Trước tiên, bạn phải có được byte từ đối tượng trước khi bạn có thể chuyển đổi nó đến một số nguyên.

Something như thế này:

var i = (int)(byte)o; 
1

này được gây ra bởi việc sử dụng CLRS của boxing and unboxing. Bất cứ khi nào bạn xử lý một kiểu giá trị như là một đối tượng, CLR sẽ tự động đóng hộp kiểu giá trị này cho bạn bên trong một đối tượng. Tuy nhiên CLR chỉ hỗ trợ đối tượng đóng hộp unboxing vào kiểu giá trị ban đầu của họ theo MSDN:

Unboxing

Unboxing là một chuyển đổi rõ ràng từ các đối tượng loại một loại giá trị hoặc từ một kiểu giao diện để một loại giá trị thực hiện giao diện . Một hoạt động unboxing gồm:

  • Kiểm tra trường hợp đối tượng để đảm bảo rằng nó là một giá trị đóng hộp của các loại giá trị nhất định.

  • Sao chép giá trị từ cá thể vào biến loại giá trị.

object o = b; Nguyên nhân CLR để tạo ra một byte đóng hộp và lưu trữ nó trong o như là một đối tượng. var i = (int)o; sau đó cố gắng bỏ hộp byte đã đóng hộp thành một int. Điều này gây ra một ngoại lệ như kiểu đóng hộp (byte) và kiểu giá trị (int) khác nhau.

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