【问题标题】:Why does the signature of object.ToString state that it can return a null value为什么object.ToString的签名声明它可以返回一个空值
【发布时间】:2021-11-12 14:34:47
【问题描述】:

我在我们的项目中启用可空功能时遇到了这个问题。

在 Net 5.0 中,object.ToString() 的签名是

public virtual string? ToString ();

这是为什么呢? notes to Inheritors 偶数状态

您的 ToString() 覆盖不应返回 Empty 或空字符串。

那么为什么签名声明它可以呢?我找不到任何相关信息。

但我的想法是

  • 那些没有阅读上述注释并从他们的 ToString 方法返回 null 的人的向后可比性。
  • 让阅读过该笔记的人忽略它

但由于我们想将可空功能附带的警告视为错误,现在我们必须添加! 或在我们使用ToString 的任何地方进行空检查。

是否还有其他充分理由说明签名保持原样?

【问题讨论】:

  • "那些没有阅读上面提到的注释并从他们的 ToString 方法返回 null 的人的向后可比性。" -- 正是这样:有现实世界那里的 ToString 实现返回 null。您会注意到,如果您在 VS 中编写自己的 ToString 方法,则返回类型默认为 string 而不是 string? - 这是为了鼓励您遵循指南。如果您使用定义了自己的ToString 方法并使用NRT 的类型,它可能还会返回string,并且您不需要对其进行空检查。
  • 这能回答你的问题吗? Nullable references types and ToString() overload

标签: c# nullable nullable-reference-types


【解决方案1】:

那些没有阅读上面提到的注释并从他们的 ToString 方法返回 null 的人的向后可比性。

正是这样:现实世界中的 ToString 实现会返回 null。详情请参阅this discussion

您会注意到,如果您在 VS 中编写自己的 ToString 方法,则返回类型默认为 string 而不是 string? - 这是为了鼓励您遵循指南。如果您使用定义了自己的ToString 方法并使用NRT 的类型,它可能还会返回string,并且您不需要对其进行空检查。

object.ToString() 返回string? 的事实只是相关的:

  1. 当您将一个对象强制转换为object 时,编译器不知道其覆盖的ToString 方法是否实际返回string?string
  2. 当您使用不受约束的泛型类型时,出于同样的原因
C c = new C();
string s1 = c.ToString(); // No warning

object o = c;
string s2 = o.ToString(); // Warning

public class C
{
    public override string ToString() => "";
}

SharpLab

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2022-12-03
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多