Это работает, как и ожидалось:
byte b = 7; var i = (int)b;
В то время как это выдает InvalidCastException:
InvalidCastException
byte b = 7; object o = b; var i = (int)o;
Почему приведение не удается из object, когда базовый тип все ещеbyte
object
byte
Поскольку byte имеет явное преобразование в int, а object - нет.
int
Если вы скажете компилятору, что object действительно a byte, то он снова позволит вам явно привести к int.
byte b = 7; object o = b; var i = (int)((byte)o);
Ссылки:
Преобразование типов и типов байт
Это вызвано использованием CLR упаковки и распаковки .Всякий раз, когда вы рассматриваете тип значения как объект, CLR автоматически помечает этот тип значения для вас внутри объекта.Однако CLR поддерживает распаковку только штучных объектов в исходный тип значения в соответствии с MSDN :
Распаковка Распаковка - явное преобразованиеот объекта типа к типу значения или от типа интерфейса к типу значения, который реализует интерфейс.Операция распаковки состоит из: Проверка экземпляра объекта, чтобы убедиться, что это упакованное значение данного типа значения. Копирование значения из экземпляра в переменную типа значения.
Распаковка
Распаковка - явное преобразованиеот объекта типа к типу значения или от типа интерфейса к типу значения, который реализует интерфейс.Операция распаковки состоит из:
Проверка экземпляра объекта, чтобы убедиться, что это упакованное значение данного типа значения.
Копирование значения из экземпляра в переменную типа значения.
object o = b; Заставляет CLR создавать упакованный байт и сохраняет его в o какБыть объектом.var i = (int)o; затем пытается распаковать упакованный байт в int.Это вызывает исключение, так как в штучной упаковке тип (байт) и тип значения (int) различаются.
object o = b;
var i = (int)o;
Вы должны сначала получить байт от объекта, прежде чем сможете преобразовать его в целое число.
Примерно так:
var i = (int)(byte)o;