Odpowiedź Jona jest poprawna, ale chciałbym dodać kilka dodatkowych uwag.
Dlaczego Console.WriteLine(null)
podaje błąd kompilacji?
Istnieje 19 przeciążeń, Console.WriteLine
a trzy z nich mają zastosowanie do a null
: ten, który przyjmuje a string
, ten, który przyjmuje a char[]
i ten, który przyjmuje object
. C # nie może określić, który z tych trzech elementów masz na myśli, więc wyświetla błąd. Console.WriteLine((object)null)
byłoby legalne, ponieważ teraz jest jasne.
dlaczego Console.WriteLine(a)
pisze pustą linię?
a
jest null int?
. Rozpoznanie przeciążenia wybiera object
wersję metody, więc int?
jest opakowana w odwołanie o wartości null. Więc to jest w zasadzie to samo Console.WriteLine((object)null)
, co, co pisze pustą linię.
Dlaczego nie ma NullReferenceException
na podwyższeniu?
Gdzie jest zerowe odniesienie , o które się martwisz? a
jest wartością null, int?
która nie jest typem referencyjnym! Pamiętaj, że typy wartości dopuszczające wartość null są typami wartości , a nie typami odwołań , więc nie oczekuj, że będą miały semantykę odwołania, chyba że są opakowane w typ referencyjny. W dodatku nie ma boksu.
++
,+=
i+
zniosły warianty. Dlatego oświadczeniaa++;
,a += 1;
ia = a + 1;
wszystkie są dozwolone. Każdy produktnull
(bez wyjątku), jeślia
jest początkowonull
.