Бокс / Распаковка и Nullable? - PullRequest
7 голосов
/ 17 декабря 2008

Я понимаю, что бокс и распаковка - это приведение (реальный тип к объекту ... объект к реальному типу). Но я не понимаю, что MSDN говорит об этом с Nullable. Вот текст, который я не понимаю:

Когда упаковывается тип, допускающий значение NULL, в общеязыковой среде автоматически помещается базовое значение объекта Nullable, а не сам объект Nullable. То есть, если свойство HasValue имеет значение true, содержимое свойства Value упаковано. Когда базовое значение типа Nullable распаковано, общеязыковая среда выполнения создает новую структуру Nullable, инициализированную для базового значения. Источник

Когда вы изменяете свой объект на реальный тип, переменная реального типа, которая была обнуляемой, будет типом объекта? Я не понимаю?

Ответы [ 3 ]

11 голосов
/ 17 декабря 2008

Это говорит о том, что если вы делаете:

int? x = 5;
object y = x; // Boxing

В итоге вы получаете int в штучной упаковке, а не Nullable<int> в штучной упаковке. Точно так же, если вы делаете:

int? x = null; // Same as new Nullable<int>() - HasValue = false;
object y = x; // Boxing

Тогда у заканчивается нулевой ссылкой.

8 голосов
/ 17 декабря 2008

Что это означает, что если вы делаете:

int? i = 5;
object o = i;

это "int" (5) в штучной упаковке, а не "int?" (5). Если бы x было нулевым (! HasValue), o было бы нулевым, а не рамкой вокруг пустого «int?»

Затем, когда вы распакуете:

i = (int?)o;

Если o равен нулю, я становится пустым "int?"; в противном случае 5 распаковывается и используется для создания «нового int? (5)».

По сути, вы не должны (если не будете обманывать) иметь возможность получить nullable<T> в штучной упаковке напрямую - только в штучной упаковке T

3 голосов
/ 17 декабря 2008

Если Nullable<T> равно null, оно будет помечено как нулевая ссылка и не будет вести себя как тип значения в штучной упаковке с HasValue = true.

На самом деле, для реализации этой функции требовалось, чтобы CLR изначально поддерживала тип Nullable<T> и относилась к нему по-другому. Разработчики не могут написать свой собственный тип, который работает как Nullable<T>.

Стоит отметить, что это была одна из поздних функций .NET 2.0. В ранних бета-версиях Nullable<T> вел себя как обычная структура. В последнем выпуске он был заменен на пустую ссылку. Это изменение было особенно разрушительным для команды SQL Server CLR, и им пришлось изменить некоторые фундаментальные вещи для него.

...