为什么 object.ToString 的签名声明它可以 return 空值

Why does the signature of object.ToString state that it can return a null value

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

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

public virtual string? ToString ();

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

Your ToString() override should not return Empty or a null string.

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

但我的想法是

但是由于我们想将可空特性带来的警告视为错误,现在我们必须在使用 ToString.

的任何地方添加 ! 或空检查

签名保持原样还有其他充分的理由吗?

Backwards comparability for those people who didn't read the note mentioned above and return null from their ToString method.

正是这样:现实世界中有 return null 的 ToString 实现。有关详细信息,请参阅 this discussion

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

事实 object.ToString() returns string? 仅相关:

  1. 当您将一个对象转换为 object 时,编译器不知道其重写的 ToString 方法实际上是 returns 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