Відповідь Джона правильна, але я б додав кілька додаткових приміток.
Чому виникає 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.