2010-06-04 3 views
7

кода для иллюстрации:Попытка бросить коробочный Int в байты

 int i = 5; 
     object obj = i; 
     byte b = (byte)obj; // X 

При запуске, это создает System.InvalidCastException («Указанный бросок не действителен») в строке «X». Выполнение двойного броска работа:

 byte b = (byte)(int)obj; 

Я бы подумал, что вы должны быть в состоянии бросить коробочный Int (если это имеет значение в диапазоне 0..255) до байта. Может ли кто-нибудь пролить свет на это?

(Это в .net 2.0, в случае, если это имеет значение).

ответ

18

Разница в поведении, которую вы видите, представляет собой разницу между identity and representation.

распаковка является идентичность литой и представление сохраняющих операции. Однако литье int в byte составляет смена изображения (поскольку существует потенциальная потеря точности).

Вы получаете InvalidCastException, когда вы пытаетесь распаковывать в int как byte потому идентичности коробочных значений не byte, это int. Когда вы пишете byte b = (byte)obj, вы сообщаете выполнения, я знаю, что то, что там являетсяbyte, но то, что вы на самом деле хотите сказать, Я думаю, что там может быть конвертированы в byte ,

Чтобы сделать последнее заявление, сначала необходимо объявить идентификатор объекта, который является int. Тогда и только тогда вы можете сделать преобразование, изменяющее представление, до byte.

Обратите внимание, что это применяется, даже если тип цели «больше», то есть Int64. Все Явные преобразования, для которых тип адресата не находится в дереве наследования типа источника, считаются изменяющимися представлениями. А так как все типы производятся от System.Object, unboxing по определению не может изменить представление.

+0

спасибо Aaronaught, это объясняет это хорошо. –

5

MSDN explicitly says, который распаковывает в другой тип, выдает InvalidCastException.

Мое понимание заключается в том, что тип, с которым переменная распаковывается, фактически является параметром для underlying CIL assembly command. Это код unbox, который фактически выбрасывает InvalidCastException.

InvalidCastException выбрасывается, если объект не помещен в качестве valType.

Смежные вопросы