Я знаю, що я неймовірно запізнився на це питання, але я відчуваю, що відповідь стане актуальною, оскільки остання основна ітерація C # наблизиться до випуску, а потім вийде. У C # 8.0 відбудуться серйозні зміни, C # прийме на себе все типи вважаються не нульовими.
За словами Мадса Торгерсена:
Проблема в тому, що нульові посилання настільки корисні. У C # вони є значенням за замовчуванням для кожного типу посилання. Яким ще було б значення за замовчуванням? Яке ще значення мала б змінна, поки ви не вирішите, що ще їй призначити? Яким ще значенням ми могли б прокласти щойно виділений масив посилань, доки ви не обійдетесь заповнити його?
Крім того, іноді нуль є розумним значенням сам по собі. Іноді ви хочете представити той факт, що, скажімо, поле не має значення. Це нормально передавати "нічого" для параметра. Однак акцент робиться на інколи. І в цьому полягає інша частина проблеми: такі мови, як C #, не дозволяють вам виражати, чи є нуль тут гарною ідеєю чи ні.
Отже, резолюція, викладена Мадсом, така:
Ми вважаємо, що частіше хочеться, щоб посилання не було нульовим. Типи посилань, що підлягають нульовому використанню, були б рідкіснішими (хоча ми не маємо хороших даних, щоб сказати нам, скільки), тому саме вони потребують нової анотації.
Мова вже має поняття - і синтаксис - типів значень, що мають значення. Аналогія між ними зробить мовне додавання концептуально простішим та лінгвістично простішим.
Здається, правильно, що ви не повинні обтяжувати ні себе, ні споживача громіздкими нульовими значеннями, якщо тільки ви активно не вирішили, що хочете їх. Нулі, а не їх відсутність, повинні бути тим, для чого вам явно потрібно вибрати.
Приклад бажаної функції:
public class Person
{
public string Name { get; set; } // Not Null
public string? Address { get; set; } // May be Null
}
Попередній перегляд доступний для Visual Studio 2017, попередній перегляд 15.5.4+.