В C# 8.0, предположим, что у меня включены допустимые ссылки с <Nullable>enable</Nullable>
в .csproj. Это дает мне предупреждения, когда я пытаюсь использовать ссылки с возможными нулевыми значениями при ненулевом использовании, так что это здорово. Затем я могу включить <WarningsAsErrors />
и получить это строго как ошибки, а не предупреждения.
Так что я надеялся, что с помощью этой языковой конструкции я смог избежать определенного кода с нулевой проверкой. В частности, я (и многие другие) часто писал такие методы:
public string Message { get; set; }
public void SetFoo(string message) {
Message = message ?? throw new ArgumentNullException(nameof(message));
Console.WriteLine(Message.ToUpper())
}
Я надеялся отказаться от проверки на ноль, так как ссылка не обнуляема, и вместо этого написать
public string Message { get; set; }
public void SetFoo(string message) {
Message = message;
Console.WriteLine(Message.ToUpper())
}
Кажется, это хорошо, так как вызов типа myThing.SetFoo(null);
генерирует предупреждение / ошибку компилятора. Однако я считаю, что такой код, как myThing.SetFoo(null!);
, компилируется и запускается в любом случае! Итак, для того, чтобы защищать код, мне все равно нужно сохранить старую оговорку на случай, если кто-то вызовет ее с таким неправильным использованием оператора !
, верно?
Есть ли способ избежать написания кода для проверки на нулевое значение в ненулевых ссылках? Я ожидаю, что может быть способ заставить компилятор сделать вывод, что он должен выдать исключение в таких случаях, а не просто игнорирование необнуляемости, но я этого не вижу.