Прочитав этот вопрос на 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.