C#10 不清楚 CS8600 警告
Posted
技术标签:
【中文标题】C#10 不清楚 CS8600 警告【英文标题】:C#10 unclear CS8600 warning 【发布时间】:2021-12-07 10:14:59 【问题描述】:我目前正在将 Blazor 项目迁移到 C# 10 附带的 .NET6。 使用新语言版本时,我收到以下代码的警告:
if (tmp is null)
oldValue = "";
else
oldValue = tmp.ToString();
警告是:CS8600“将空文字或可能的空值转换为不可为空的类型”。
tmp
的类型为 object?
。这就是我在 if 子句中检查它是否为空的原因。
我注意到出现了许多此类警告。
那背后的原因是什么?帮助页面尚不包含任何信息。 (见here)
【问题讨论】:
object.ToString
有 string?
返回类型。试试oldValue = tmp?.ToString() ?? ""
关于为什么object.ToString()
被注释为返回string?
而不是string
的激动人心的讨论,请参见此处:github.com/dotnet/coreclr/pull/23466
@Satpal is
总是检查 null
而==
可能调用重载运算符
@UnusualWays 您的 IDE 是否建议进行任何自动重构?在 Visual Studio 中,您也许可以单击一个灯泡并让 IDE 解决问题。
@JL0PD - 您可以将第一条评论作为答案。
【参考方案1】:
当编译器不确定类型是否可以为空时,似乎会引发 CS8600 警告。如果你投 oldValue = (string?) 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? oldValue;
【讨论】:
以上是关于C#10 不清楚 CS8600 警告的主要内容,如果未能解决你的问题,请参考以下文章
UnhandledPromiseRejectionWarning:不清楚警告是针对哪个文件或行[重复]