Прочитав этот вопрос на HNQ, я продолжил читать о Nullable Reference Types в C # 8 и провел несколько экспериментов.
Я очень хорошо знаю, что 9 раз из 10, или даже чаще, когда кто-то говорит: «Я нашел ошибку компилятора!» это на самом деле дизайн, и их собственное недоразумение. И так как я начал изучать эту функцию только сегодня, очевидно, я не очень хорошо понимаю ее. Теперь, давайте посмотрим на этот код:
#nullable enable
class Program
{
static void Main()
{
var s = "";
var b = s == null; // If you comment this line out, the warning on the line below disappears
var i = s.Length; // warning CS8602: Dereference of a possibly null reference
}
}
После прочтения документации, на которую я ссылался выше, я ожидал, что s == null
строка выдаст мне предупреждение - в конце концов s
это явно не обнуляемое значение, поэтому сравнивать его null
не имеет смысла.
Вместо этого я получаю предупреждение в следующей строке, и предупреждение говорит, что s
возможна нулевая ссылка, хотя для человека очевидно, что это не так.
Более того, предупреждение не отображается, если мы не сравниваем s
с null
.
Я немного погуглил и столкнулся с проблемой GitHub , которая, как оказалось, была полностью о другом, но в процессе я поговорил с участником, который дал некоторое представление об этом поведении (например, «Нулевые проверки часто являются полезным способом»). сказать компилятору сбросить свой предыдущий вывод об обнуляемости переменной. " ) Однако это все еще оставило меня без ответа на главный вопрос.
Вместо того, чтобы создавать новую проблему на GitHub и потенциально занимать время невероятно занятых участников проекта, я делюсь этим с сообществом.
Не могли бы вы объяснить мне, что происходит и почему? В частности, почему на s == null
линии не генерируются предупреждения , и почему мы имеем, CS8602
когда это не похоже на null
ссылку здесь? Если вывод обнуления не является пуленепробиваемым, как предполагает связанный поток GitHub, как он может пойти не так? Каковы были бы некоторые примеры этого?
?
потому что s
это не nullable. Это не становится обнуляемым просто потому, что мы были достаточно глупы, чтобы сравнивать это с null
.