Відповідь Джона правильна, але я б додав кілька додаткових приміток.
Чому виникає Console.WriteLine(null)
помилка компіляції?
Є 19 перевантажень, Console.WriteLine
і три з них застосовні до null
: тієї, яка приймає a string
, тієї, яка приймає a, char[]
і тієї, яка приймає object
. C # не може визначити, який із цих трьох маєте на увазі, тож він дає помилку. Console.WriteLine((object)null)
було б законним, бо зараз це зрозуміло.
чому Console.WriteLine(a)
пише порожній рядок?
a
є нульовим int?
. Роздільна здатність перевантаження вибирає object
версію методу, тому поле int?
вказується в нульове посилання. Так що це в основному те саме Console.WriteLine((object)null)
, що пише порожній рядок.
Чому немає NullReferenceException
на прирост?
Де нульова посилання, яка вас хвилює? a
це нуль, int?
який не є еталонним типом для початку! Пам'ятайте, що типи змінних значень - це типи значень , а не типові типи , тому не сподівайтеся, що вони матимуть посилання-семантику, якщо вони не позначені кодом до опорного типу. Додатку немає боксу.
++
,+=
і+
підняли варіанти. Тому твердженняa++;
,a += 1;
іa = a + 1;
всі вони дозволені. Кожна продукціяnull
(не виняток), якщоa
вона спочаткуnull
.