Попытка привести в байтах упакованный int - PullRequest
7 голосов
/ 04 июня 2010

Код для иллюстрации:

        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, в случае, если это имеет значение).

Ответы [ 2 ]

19 голосов
/ 04 июня 2010

Различие в поведении, которое вы видите, - это разница между идентичностью и представлением .

Распаковка - это идентификация приведение и сохранение представления операция. Однако приведение int к byte означает изменение представления (поскольку возможна потеря точности).

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

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

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

5 голосов
/ 04 июня 2010

MSDN явно говорит , что при распаковке в другой тип будет InvalidCastException.

Насколько я понимаю, тип, к которому распакована переменная, на самом деле является параметром базовой команды сборки CIL . Это unbox код операции, который на самом деле выдает InvalidCastException.

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

...