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