Я знаю, что невероятно опаздываю с этим вопросом, но я чувствую, что ответ станет актуальным, когда последняя крупная итерация C # приблизится к выпуску, а затем будет выпущена. В C # 8.0 произойдет серьезное изменение, C # будет предполагать, что все типы не считаются нулевыми.
По словам Мадса Торгерсена:
Проблема в том, что пустые ссылки так полезны. В C # они являются значением по умолчанию для каждого ссылочного типа. Каким еще будет значение по умолчанию? Какое еще значение будет иметь переменная, пока вы не решите, что еще ей присвоить? Каким еще значением мы могли бы заполнить только что выделенный массив ссылок, пока вы не дойдете до его заполнения?
Кроме того, иногда значение null само по себе является разумным значением. Иногда вы хотите изобразить тот факт, что, скажем, поле не имеет значения. Что можно передать «ничего» в качестве параметра. Однако упор делается на иногда. И в этом заключается еще одна часть проблемы: языки, подобные C #, не позволяют вам выразить, является ли нуль здесь хорошей идеей или нет.
Итак, резолюция, изложенная Мэдсом, такова:
Мы считаем, что чаще всего требуется, чтобы ссылка не была нулевой. Обнуляемые ссылочные типы будут более редкими (хотя у нас нет точных данных, чтобы сказать нам, в каком количестве), поэтому именно они требуют новой аннотации.
В языке уже есть понятие и синтаксис для типов значений, допускающих значение NULL. Аналогия между ними сделает добавление языка концептуально проще, а лингвистически проще.
Кажется правильным, что вы не должны обременять себя или своего потребителя громоздкими нулевыми значениями, если вы сами не решили, что они вам нужны. Нулевые значения, а не их отсутствие, должны быть тем, что вы должны явно выбрать.
Пример желаемой функции:
public class Person
{
public string Name { get; set; } // Not Null
public string? Address { get; set; } // May be Null
}
Предварительная версия доступна для Visual Studio 2017, предварительная версия версии 15.5.4+.