Odpowiedź Jona jest poprawna, ale chciałbym dodać kilka dodatkowych uwag.
Dlaczego Console.WriteLine(null)podaje błąd kompilacji?
Istnieje 19 przeciążeń, Console.WriteLinea 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ę?
ajest null int?. Rozpoznanie przeciążenia wybiera objectwersję 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 NullReferenceExceptionna podwyższeniu?
Gdzie jest zerowe odniesienie , o które się martwisz? ajest 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śliajest początkowonull.