为什么 object.ToString 的签名声明它可以返回 null 值

Ack*_*ari 3 c# nullable nullable-reference-types

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

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

public virtual string? ToString ();
Run Code Online (Sandbox Code Playgroud)

这是为什么?给继承者的注释甚至指出

您的 ToString() 重写不应返回空或空字符串。

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

但我的想法是

  • 对于那些没有阅读上述注释并从 ToString 方法返回 null 的人来说,具有向后可比性。
  • 让阅读该注释的人忽略它

但由于我们希望将可空特性附带的警告视为错误,所以现在我们必须!在使用的任何地方添加或空检查ToString

签名之所以如此,还有其他充分的理由吗?

can*_*on7 6

对于那些没有阅读上述注释并从 ToString 方法返回 null 的人来说,具有向后可比性。

正是这样:现实世界中存在返回null. 有关完整详细信息,请参阅此讨论

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

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() => "";
}
Run Code Online (Sandbox Code Playgroud)

夏普实验室