Различие в поведении, которое вы видите, - это разница между идентичностью и представлением .
Распаковка - это идентификация приведение и сохранение представления операция. Однако приведение int
к byte
означает изменение представления (поскольку возможна потеря точности).
Вы получаете InvalidCastException
при попытке распаковать int
как byte
, потому что идентификатор в штучной упаковке не является byte
, это int
. Когда вы пишете byte b = (byte)obj
, вы говорите о времени выполнения, Я знаю, что там есть a byte
, но вы действительно хотите сказать: I думаю, что то, что там, может быть преобразовано в byte
.
Чтобы сделать последнее утверждение, вы должны сначала объявить идентификатор объекта, который является int
. Тогда и только тогда вы сможете преобразовать представление в byte
.
Обратите внимание, что это применимо, даже если тип цели "больше" - то есть Int64
. Все явные преобразования, для которых тип назначения отсутствует в дереве наследования типа источника, считаются изменяющими представление. А поскольку все типы происходят от System.Object
, распаковка по определению не может изменить представление.