#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/234663.@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;