Проблема в том, что int не является объектом.
Int может быть упакован в объект. Результирующий объект (также известный как упакованный int), конечно же, является объектом, но уже не совсем int.
Обратите внимание, что «is», который я использую выше, не совпадает с оператором C# является. Мое «является» означает «преобразуется с помощью неявного преобразования ссылки». Это значение «is» используется, когда мы говорим о ковариантности и контравариантности.
Int неявно преобразуется в объект, но это не преобразование ссылки. Его надо запаковать.
House
можно неявно преобразовать в Asset
посредством преобразования ссылки. Нет необходимости создавать или изменять какие-либо объекты.
Рассмотрим пример ниже. Обе переменные house
и asset
ссылаются на один и тот же объект. Переменные integer
и boxedInt
, с другой стороны, содержат одно и то же значение, но ссылаются на разные объекты.
House house = new House();
Asset asset = house;
int integer = 42;
object boxedInt = integer;
упаковка и распаковка не так проста, как может показаться. Он имеет много тонкостей и может неожиданным образом повлиять на ваш код. Смешивание бокса с ковариантностью и контравариантностью — это простой способ ослепить кого угодно.
11.06.2010
System.Object
, бесполезна. Гораздо полезнее признать, что для каждого типа значения существует связанный тип упакованного класса, производный отSystem.ValueType
. Типы значений неявно преобразуются в их эквиваленты типа класса, а явное приведение может использоваться для копирования содержимого упакованного типа значения обратно в реальный. 27.06.2012