【问题标题】:C#10 unclear CS8600 warningC#10 不清楚 CS8600 警告
【发布时间】: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 - 您可以将第一条评论作为答案。

标签: c# blazor c#-10.0


【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-28
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多