Właśnie zobaczyłem to pytanie na liście "powiązanych pytań" pod numerem Why Nullable<T> is a struct? i uważam, że moja odpowiedź również tutaj obowiązuje. Cały punkt Nullable<T>
ma zachowywać się jak typ wartości pod każdym względem, z wyjątkiem możliwości pobrania wartości pustej.
Wartość zerowa odniesienia zerowego można rozpatrywać na dwa sposoby.Jedną jest to, że niczego nie odwołuje, a inną - że nie ma żadnej znaczącej wartości. Te rzeczy to dwa różne sposoby mówienia o tym samym, ale mają różne zastosowania.
daje nam możliwość powiedzenia "to nie ma znaczącej wartości" i do tego stopnia może mieć tę samą semantykę, co odwołanie zerowe, ale nie jest jak odniesienie w jakikolwiek inny sposób. Gdy wartość pusta to nieważność, to czysto "nie ma żadnej znaczącej wartości" null - nie "nie odnosi się do niczego", a gdy nie jest zerowa, zawiera wartość, a nie odnosi się do niej.
(Aaronaught twierdzi, że oznacza to, że Nullable nie może w rzeczywistości zawierać wartości null, podczas gdy ja się nie zgadzam, ponieważ na poziomie, na którym on działa, może mieć semantyczną wartość zerową, jego punkt warty jest rozważenia, nawet gdy "null" a Nullable różni się od odniesienia - tak naprawdę nasz brak zgody jest kwestią tego, jakiego poziomu abstrakcji wybieramy).
Dziwne zachowanie boksu zabiera trochę czasu, ale cieszę się, że tak właśnie jest; w przeciwnym razie zostanie utracona znaczna część wartości 'Nullable' (która pochodzi z przezroczystości przechodzącej przez wartość). –
LBushkin
W rzeczywistości zachowanie boksu było zmianą, która nastąpiła pod koniec cyklu programowania .NET 2.0. We wczesnych betach 'Nullable' był prostą strukturą. W praktyce, gdy faktycznie używasz typów nulla do przechowywania nieistniejących wartości, ja też czuję, że to zachowanie jest bardziej naturalne. –
Świetne dodane informacje przy okazji – Nick