2013-09-03 27 views
5

Typ Nullable<T> definiowany jest jako , zdefiniowany jako struct. W .Net nie można przypisać null do struct, ponieważ structs są typami wartości, które nie mogą być reprezentowane przez null (z wyjątkiem Nullable<T>).Sposób działania .Net umożliwia ustawienie wartości Null w wartości Null

int i = null; // won't compile - we all know this 
int? i = null; // will compile, and I'm glad it does, and it should compile, but why? 

Skąd Nullable<T> stać się wyjątkiem od reguły „Nie można przypisać null do typu wartości?” Dekompilowany kod dla Nullable<T> nie daje wglądu w to, jak to się dzieje.

+0

możliwy duplikat [w jaki sposób typy null można zaimplementować pod maską w .net?] (Http://stackoverflow.com/questions/2503811/how-are-nullable-types-implemented-under-the-hood-in -net) –

Odpowiedz

13

W jaki sposób Nullable<T> stał się wyjątkiem od reguły "Nie można przypisać wartości zerowej do typu wartości?"

Zmieniając język, w zasadzie. Dosłowne tłumaczenie z "wartości zerowej" na "wartość pustą odpowiedniego typu".

W czasie wykonywania "wartość pusta" dla typu wartości zerowej jest wartością, gdzie właściwość HasValue zwraca false. Więc tak:

int? x = null; 

odpowiada:

int? x = new int?(); 

Warto rozdzielając ramowych części Nullable<T> z aspektów językowych i CLR. W rzeczywistości sam CLR nie musi wiedzieć wiele o zerowych typach wartości - o ile mi wiadomo, jedynym ważnym aspektem jest to, że wartość pusta typu wartości zerowej jest zapakowana w odwołanie zerowe, i możesz unbox puste odwołanie do wartości pustej dowolnego typu wartości zerowej. Nawet to zostało wprowadzone dopiero przed ostatecznym wydaniem .NET 2.0.

Wsparcie język przeważnie składa się z:

  • cukru składniowe w postaci ? tak int? jest równoważna Nullable<int>
  • Lifted operators
  • Zmieniona sens null
  • Operator null koalescencyjny (??) - który nie jest ograniczony do typów wartości zerowalnych
+3

@Dan: Jeśli chcesz dużo więcej szczegółów, dedykuję cały rozdział nullable typów wartości w C# w głębi :) –

+0

@ JonSkeet Więc co by było, aby 'int i = null;' równoważne 'int i = new int(); '? – Dan

+0

Przypuszczam, że środowisko wykonawcze po prostu ustawi właściwość 'HasValue' na wartość false, gdy ustawimy' int i = null; 'Mam rację @Jon –

Powiązane problemy