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