Концепция упаковки и распаковки занимает одно из основных мест в системе типов языка. Она обеспечивает связь между размерными и ссылочными типами делая возможным преобразование значения любого размерного типа к типу Object и наоборот. Упаковка и распаковка позволяет рассматривать систему типов унифицированным образом, когда значение любого типа может рассматриваться как объект.
Упаковка делает возможным неявное преобразование размерного типа к ссылочному. Допускаются следующие преобразования упаковки:
Любой размерный тип (включая перечисления) может быть преобразован к типу Object.
Любой размерный тип (включая перечисления) может быть преобразован к типу System.ValueType.
Любой размерный тип может быть преобразован к интерфейсному, если он его реализует.
Любой перечислимый тип может быть преобразован к типу System.Enum.
Процесс упаковки заключается в создании экземпляра объекта и копировании значения размерного типа в этот экземпляр.
Распаковка делает возможным явное преобразование ссылочного типа к размерному. Допускаются следующие преобразования распаковки:
Типа Object к любому размерному типу (включая перечисления).
Типа System.ValueType к любому размерному типу (включая перечисления).
Интерфейсного типа к любому размерному типу, который реализует данный интерфейс.
Типа System.Enum к любому перечислимому типу.
Операция распаковки заключается в проверке того, что экземпляр объекта является упакованным значением данного размерного типа, с последующим копированием значения из экземпляра.
В процессе распаковки производится проверка того, что экземпляр объекта был ранее создан посредством упаковки значения данного размерного типа. Если исходный операнд равен Null, генерируется исключительная ситуация типа System.NullReferenceException. Если исходный операнд является ссылкой на несовместимый объект, то генерируется исключительная ситуация типа System.InvalidCastException.
См. также: