【发布时间】:2021-02-24 12:46:39
【问题描述】:
.Net Core defines object.ToString() as public virtual string? ToString();
这意味着如下代码会引发CS8602“取消引用可能为空的引用”警告:
object t = "test";
var s = t.ToString();
Console.WriteLine(s.Length); // Warning CS8602
这很容易通过写s!.Length 或t.ToString()!; 来解决,但我的问题是:
在什么情况下从object.ToString() 的实现返回null 是正确的?
答案似乎是:“您永远不应该从 object.ToString() 返回 null”,这很公平 - 但这确实引发了另一个问题,即“在这种情况下,为什么 Microsoft 将其声明为 @ 987654335@" ?
旁白:
下面的一些 cmets 建议,因为实现可能错误地返回 null,所以返回值必须声明为 string?。
如果这是真的,那么为什么同样的逻辑不适用于ICloneable.Clone(),它不声明为返回object??
这个逻辑肯定适用于每个返回引用类型的接口方法吗?这种方法的任何实现(例如,ICustomFormatter.Format())理论上可以返回null - 因此返回值应该可以为空。但他们不是。
阅读了 DavidG 提供的链接,我相信该主题的讨论回答了我满意的问题:
【问题讨论】:
-
“在什么情况下从 object.ToString() 的实现中返回 null 是正确的?” 从不,但你可以这样做。跨度>
-
我不认为有可接受的情况,但因为“字符串”是可以为空的,任何人都可以为他的对象编写自己的 ToString 实现......它仍然有可能......
-
The notes 部分字面上告诉你不要返回 null。我不知道为什么它被声明为
string?。 -
有人讨论过这个here
-
Stephen Toub 的有趣引述:"FYI, we have APIs in .NET Core that return null from ToString"
标签: c# nullable-reference-types