Почему этот тип приведёт к ошибке? - PullRequest
6 голосов
/ 28 октября 2011

Это работает, как и ожидалось:

byte b = 7;
var i = (int)b;

В то время как это выдает InvalidCastException:

byte b = 7;
object o = b;
var i = (int)o;

Почему приведение не удается из object, когда базовый тип все ещеbyte

Ответы [ 3 ]

6 голосов
/ 28 октября 2011

Поскольку byte имеет явное преобразование в int, а object - нет.

Если вы скажете компилятору, что object действительно a byte, то он снова позволит вам явно привести к int.

byte b = 7;
object o = b;
var i = (int)((byte)o);

Ссылки:

Преобразование типов и типов
байт

1 голос
/ 28 октября 2011

Это вызвано использованием CLR упаковки и распаковки .Всякий раз, когда вы рассматриваете тип значения как объект, CLR автоматически помечает этот тип значения для вас внутри объекта.Однако CLR поддерживает распаковку только штучных объектов в исходный тип значения в соответствии с MSDN :

Распаковка

Распаковка - явное преобразованиеот объекта типа к типу значения или от типа интерфейса к типу значения, который реализует интерфейс.Операция распаковки состоит из:

  • Проверка экземпляра объекта, чтобы убедиться, что это упакованное значение данного типа значения.

  • Копирование значения из экземпляра в переменную типа значения.

object o = b; Заставляет CLR создавать упакованный байт и сохраняет его в o какБыть объектом.var i = (int)o; затем пытается распаковать упакованный байт в int.Это вызывает исключение, так как в штучной упаковке тип (байт) и тип значения (int) различаются.

0 голосов
/ 28 октября 2011

Вы должны сначала получить байт от объекта, прежде чем сможете преобразовать его в целое число.

Примерно так:

var i = (int)(byte)o;
...