Можем ли мы избежать предложений защиты нулевого аргумента с ненулевыми параметрами метода в C# 8.0? - PullRequest
0 голосов
/ 16 января 2020

В 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!);, компилируется и запускается в любом случае! Итак, для того, чтобы защищать код, мне все равно нужно сохранить старую оговорку на случай, если кто-то вызовет ее с таким неправильным использованием оператора !, верно?

Есть ли способ избежать написания кода для проверки на нулевое значение в ненулевых ссылках? Я ожидаю, что может быть способ заставить компилятор сделать вывод, что он должен выдать исключение в таких случаях, а не просто игнорирование необнуляемости, но я этого не вижу.

1 Ответ

2 голосов
/ 16 января 2020

Можем ли мы избежать использования нулевых объектов защиты ссылок с ненулевыми параметрами метода в C# 8.0?

Нет, поскольку:

  • Вы можете передать null s явно, с использованием null!, , который имеет свои применения , см. Также этот вопрос .
  • Внешний код, который компилируется без поддержки обнуляемого ссылочного типа, может позвоните по коду и передайте null, не получая предупреждений или ошибок в вызывающем проекте.
...