Я думаю, вы правы по этому поводу. Необнуляемая проверка ссылок во время компиляции была убийственной функцией, которую я ждал в Code Contracts, и на самом деле ее там нет.
Если вам интересно, что это значит, рассмотрите аналогию с типами значений. Изначально они не были обнуляемыми, но теперь, если вы поставите знак вопроса после имени типа:
int? n;
Для согласованности было бы идеально, если бы то же самое было верно для ссылочных типов. Но это сломало бы все существующие программы C # и поэтому не вариант. На языке исследования Spec # они использовали суффикс восклицательного знака для обозначения ненулевого значения:
string! s = "Hello";
Как и в случае с обычными типами значений, компилятор статически проверяет, что переменная string!
не используется ни в каком пути кода до его инициализации (я считаю, что Spec # требует, чтобы объявление и инициализация происходили в одном выражении).
Он также запрещает присвоение null
этой переменной.
И, конечно, он запрещает присвоение обычного string
string!
. Так как же преодолеть разрыв между двумя типами? Выписав чек:
string x = GetStringFromSomewhere();
if (x != null)
s = x; // okay because compiler sees null check
Печальная правда в том, что большинство ссылочных переменных в большинстве программ, вероятно, не обнуляются, если программа верна. Обнуляемые переменные находятся в меньшинстве. И все же они по умолчанию.
Еще одна плохая идея 1960-х годов !