Что это означает, что если вы делаете:
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