【问题标题】:Understanding the new nullable reference types warning了解新的可为空引用类型警告
【发布时间】:2021-02-18 17:51:43
【问题描述】:

启用可空引用类型后,以下行会生成警告:

public string ConvertToString(object value) => value.ToString();

警告 CS8603:可能返回空引用。

但我不知道为什么。参数不可为空,ToString() 返回的是string 而不是string?,那么这段代码怎么可能有空引用返回呢?

【问题讨论】:

    标签: c# .net .net-5 c#-8.0 nullable-reference-types


    【解决方案1】:

    根据MSDN Object.ToString 返回可为空的字符串(string?)。

    public virtual string? ToString ();
    

    所以,现在警告变得完全清楚了——你的函数被声明为返回非空字符串,但实际上它返回了 ToString 调用的结果,它可能为空。

    更新: 经过一些额外的检查,我们发现,如果一个项目同时针对 .NET Standard 和 .NET 5.0,Intellisense 将显示 ToString 返回不可为空的 string。这是因为对于 .NET Standard,MSDN 确实表示“ToString”返回非空值。并且看起来在所描述的情况下,Intellisense 将从 .NET Standard 程序集中窥视 infromatino。

    【讨论】:

    • 嗯...我没有看到该页面在哪里说任何关于可空字符串的内容。此外,它被声明为public virtual string ToString()。 Intellisense 将其显示为返回类型string。如何从 Visual Studio 中查看此返回类型?
    • 请查看Returns 标头之前的声明块。在那里指定的返回值正是string?。我也在答案中引用了这个声明。
    • 是的,我阅读了您的回答并理解了。但是当我在 VS 中将鼠标悬停在它上面时,它显示它返回 string。当我转到定义时,它显示它返回string。你能看出这可能是我需要更清楚地理解的东西吗?无论如何,关于GitHub的更多信息。
    • 很好的链接,谢谢!我刚刚在 net core 控制台项目的最新 VS2019 中检查了示例。它向我展示了“字符串?”在工具提示中和“转到定义”之后返回类型。对于 net FW 项目,我在声明中得到了“字符串”,但没有警告(如预期的那样)。所以,我无法理解如何同时拥有警告和“字符串”声明。
    • 我想知道这是否与我的项目使用 <TargetFrameworks> 同时针对 .NET Standard 和 .NET 5.0 的事实有关。我得到可以为空的引用类型警告就好了。但 Intellisense 似乎对此一无所知。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2020-07-28
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多