Czy mógłbyś wyjaśnić, dlaczego Console.WriteLine zapisuje pusty wiersz ( Console.WriteLine(null)
podaje mi błąd kompilacji) i dlaczego nie ma NullReferenceException (nawet a+=1
nie powinien go zgłaszać)?
int? a = null;
a++; // Why there is not NullReferenceException?
Console.WriteLine(a); // Empty line
++
,+=
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
.NullReferenceException
? aleint?
nie jestReference
, to po prostuint
może miećnull
wartośćOdpowiedzi:
Obserwujesz skutki uniesienia operatora .
Z sekcji 7.3.7 specyfikacji C # 5:
Zasadniczo więc
a++
w tym przypadku jest to wyrażenie z wynikiemnull
(jakoint?
), a zmienna pozostaje nietknięta.Kiedy zadzwonisz
to jest umieszczane w pudełku
object
, co konwertuje je na odwołanie o wartości null, które jest drukowane jako pusty wiersz.źródło
Console.WriteLine(a == null ? "null" : a)
?a
jest typuint?
, powiedziałbym,a ?? "null"
że nie znajduje wspólnego typu dla dwóch operandów. Potrzebujesz podpowiedzi, któraobject
jest powszechnym typem. Rzuć więc na to dowolny operand.a
Zostaną zapakowane. Na przykład((object)a) ?? "null"
luba ?? (object)"null"
.Odpowiedź Jona jest poprawna, ale chciałbym dodać kilka dodatkowych uwag.
Istnieje 19 przeciążeń,
Console.WriteLine
a trzy z nich mają zastosowanie do anull
: ten, który przyjmuje astring
, ten, który przyjmuje achar[]
i ten, który przyjmujeobject
. 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.a
jest nullint?
. Rozpoznanie przeciążenia wybieraobject
wersję metody, więcint?
jest opakowana w odwołanie o wartości null. Więc to jest w zasadzie to samoConsole.WriteLine((object)null)
, co, co pisze pustą linię.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.źródło
To stwierdzenie oznacza po prostu
null++
np. Null + 1.Zgodnie z tym dokumentem typ dopuszczający wartość null może reprezentować prawidłowy zakres wartości dla jego bazowego typu wartości oraz dodatkową wartość null. Do wartości Nullable, wymawianej jako „Nullable of Int32”, można przypisać dowolną wartość z zakresu od -2147483648 do 2147483647 lub można przypisać wartość null
Tutaj zwiększasz wartość null, a następnie stanie się wartością zerową, a nie 0 lub inną liczbą całkowitą.
kiedy drukujesz typ dopuszczający wartość null z wartością null, drukuje on pusty zamiast błędu, ponieważ drukujesz zmienną, tj. wartość miejsca w pamięci. który może być null lub dowolną liczbą całkowitą.
Ale kiedy próbujesz wydrukować wartość null przy użyciu
Console.WriteLine(null)
, ponieważ null nie jest zmienną, więc nie odnosi się do żadnej lokalizacji pamięci. I stąd daje błąd"NullReferenceException"
.W tym przypadku 2 trafi do pamięci w tymczasowej lokalizacji, a wskaźnik wskazuje na to miejsce w pamięci do wydrukowania.
źródło