2014-06-24 16 views
5

Niedawno podczas przeglądu jednej z koncepcji natknąłem się na interesującą sytuację i chcę wiedzieć, dlaczego tak się dzieje.Nullable Types in .Net Programming Language

Wiemy jedno pojęcie, że nie można przypisać wartości null do wartości typy tj Struct, int, DateTime itd

w celu przyporządkowania null musimy zerowalne typu IE

int i powinien zostać zastąpiony z Nullable<int> i = null

Ale jeśli widzimy Nullable<T> to również od typu struct to dlaczego null mogą być przypisane bez stat którykolwiek błąd? Dlaczego Microsoft zaprzecza własnemu stwierdzeniu "Null nie można przypisać do typu wartości"

Jeśli ktoś zna przyczynę tego?

+2

Twój kompilator wie, jak wygląda typ wartości zerowej. Nie * faktycznie * przypisuje do niego * wartość zerową *. Użyj ildasm.exe, aby zobaczyć, co naprawdę robi. –

Odpowiedz

20

Ponieważ Nullable<T> ma wsparcie na poziomie kompilatora; null, w kontekście Nullable<T>, jest zasadniczo wartością z flagą HasValue z false, gdzie-jako wartość inna niż null ma flagę HasValue z true. Podobnie operatory "podniesione" pochodzą od zdefiniowanych operatorów. Podobnie, obsługa Nullable<T> ma wsparcie w zakresie boksu: pudełko Nullable<T> z HasValue z false staje się null, a nie nową instancją skrzynki.

W zasadzie: wszystko sprowadza się do , ponieważ tak zdefiniowano, że powinno działać.

Ludzie chcieli typów wartości zerowej: Microsoft wymyślił sposób, aby tak się stało.

+0

Czy potrzebne jest "wsparcie poziomu kompilatora?" Zakładam, że można to zaimplementować po prostu przez przesłonięcie operatorów/metod równościowych standardowej struktury (choć jest całkowicie możliwe, że istnieją pewne optymalizacje kompilatora ...). (Przyznaję, że nie patrzyłem na IL/kod dla 'Nullable' i prawdopodobnie powinienem!) –

+0

@DanPuzey tak, robi; w przeciwnym razie rzeczy takie jak '== null' /'! = null' lub dowolny z operatorów arytmetycznych etc: nie zadziałają. Regularna struktura nigdy nie jest pusta. –