Упаковка-преобразование типов, допускающих значение NULL (Руководство по программированию на C#)
Объекты на основе типов, допускающих значения NULL, могут быть упакованы, только если объект имеет значение, отличное от NULL. Если HasValue имеет значение false, ссылке на объект присваивается null и упаковка не выполняется. Примеры.
bool? b = null;
object o = b;
// Now o is null.
Объект имеет значение, отличное от NULL: если HasValue имеет значение true, выполняется упаковка, однако упаковывается только базовый тип, который лежит в основе объекта, допускающего значения NULL. При упаковке ненулевого типа значения, допускающего NULL, происходит упаковка самого типа значения, а не Nullable, который упаковывает тип значения. Примеры.
bool? b = false;
int? i = 44;
object bBoxed = b; // bBoxed contains a boxed bool.
object iBoxed = i; // iBoxed contains a boxed int.
Два упакованных объекта идентичны объектам, созданным при упаковке типов со значениями, отличными от NULL. И так же как и упакованные типы со значениями, отличными от NULL, они могут быть распакованы в типы, допускающие значения NULL, как показано в следующем примере.
bool? b2 = (bool?)bBoxed;
int? i2 = (int?)iBoxed;
Заметки
Поведение упакованных типов, допускающих значения NULL, предоставляет два преимущества.
Объекты, допускающие значения NULL, и их упакованные аналоги можно проверить на наличие значения NULL.
bool? b = null; object boxedB = b; if (b == null) { // True. } if (boxedB == null) { // Also true. }
Упакованные типы, допускающие значения NULL, полностью поддерживают функциональность базового типа.
double? d = 44.4; object iBoxed = d; // Access IConvertible interface implemented by double. IConvertible ic = (IConvertible)iBoxed; int i = ic.ToInt32(null); string str = ic.ToString();
См. также
Задачи
Ссылки
Типы, допускающие значения NULL (Руководство по программированию на C#)