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.ToStringstring? 返回类型。试试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:不清楚警告是针对哪个文件或行[重复]

抑制“警告 CS4014:因为不等待此调用,当前方法的执行继续......”

为啥我在 C 中收到警告“分段错误,核心转储”

为啥我的编译器警告只有一个被禁止?

VS 2008忽略警告的方法

如何使 fx cop 警告 CS0067 静音?