C # 10 неясное предупреждение CS8600

#c# #blazor #c#-10.0

#c# #блейзор #c#-10.0

Вопрос:

В настоящее время я переношу проект Blazor в файл .NET6, который поставляется с C # 10. С новой языковой версией я получаю предупреждение со следующим кодом:

 if (tmp is null)
    oldValue = "";
else
    oldValue = tmp.ToString();
 

Предупреждение: CS8600 «Преобразование нулевого литерала или возможного нулевого значения в ненулевой тип».
tmp относится к типу object? . Именно по этой причине я проверяю, имеет ли значение null в предложении if .
Я заметил, что возникает много предупреждений такого типа.

Так в чем же причина этого? Страница справки пока не содержит никакой информации. (смотрите здесь)

Комментарии:

1. object.ToString есть string? возвращаемый тип. Попробуйте oldValue = tmp?.ToString() ?? ""

2. И для захватывающей дискуссии о том, почему object.ToString() аннотируется как возвращаемый string? , а Не string , смотрите Здесь: github.com/dotnet/coreclr/pull/23466

3.@Satpal is всегда проверяет null , == может ли вызвать перегруженный оператор

4. @UnusualWays Предлагает ли ваша IDE какой-либо автоматический рефакторинг? В Visual Studio вы можете щелкнуть по лампочке и позволить IDE устранить проблему.

5. @JL0PD — вы можете сделать этот 1-й комментарий ответом.

Ответ №1:

Похоже, что предупреждение CS8600 выдается, когда компилятор не уверен, является ли тип обнуляемым или нет. Если вы приведете oldValue = (строка?) tmp; компилятор доволен, и предупреждение исчезает.

Ответ №2:

вы должны привести к нулевому значению, например

     int? tmp = 0;
    string oldValue;

    oldValue = tmp == null ? "" : ((int)tmp).ToString();
 

или использование вашего синтаксиса

     if (tmp is null)
        oldValue = "";
    else
        oldValue = ((int) tmp).ToString();
 

Ответ №3:

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

 object? oldValue;