c# - 什么情况下`object.ToString()`应该返回null?
问题描述
.Net Core定义object.ToString()
为public virtual string? ToString();
这意味着如下代码会引发CS8602
“取消引用可能为空的引用”警告:
object t = "test";
var s = t.ToString();
Console.WriteLine(s.Length); // Warning CS8602
这很容易通过编写s!.Length
or来解决t.ToString()!;
,但我的问题是:
null
在什么情况下从 的实现中返回是正确的object.ToString()
?
答案似乎是:“你永远不应该从 object.ToString() 返回 null”,这很公平——但这确实引发了另一个问题,即“在这种情况下,为什么微软将其声明为public virtual string? ToString();
”?
在旁边:
下面的一些评论表明,由于实现可能错误地返回 null,因此返回值必须声明为string?
.
如果这是真的,那么为什么相同的逻辑不适用于ICloneable.Clone()
未声明为返回的object?
?
这个逻辑肯定会适用于每个返回引用类型的接口方法吗?这种方法的任何实现(例如,ICustomFormatter.Format()
)理论上都可以返回null
- 因此返回值应该是可以为空的。但他们不是。
阅读了 DavidG 提供的链接后,我相信该主题的讨论回答了我满意的问题:
解决方案
我看不出一个人想要anything.ToString()
回来的原因null
,但谁知道呢?
然后,出于兼容性原因,我认为object.ToString()
它被定义为返回 a string?
:这自 .NET 的 v1 以来就存在,并且始终被定义为返回 astring
并且string
作为引用类型的 a 可以为 null。“现代”声明简单地说:返回的字符串有可能为空。
请记住,这个string?
东西是非常新的并且仅仅是元数据:即使它是输入的string
(就像在旧版本中一样),实现仍然可以设法返回 null。
换句话说,全新的 API 可以(并且应该)根据需要使用Nullable注释,但是对现有库的重新键入必须尊重库所做的事情。
我说重新输入是因为它不是真正的输入,只是表示预期行为的注释。这有点类似于 Typescript “注释” Javascript 代码的方式:底层类型系统仍然是旧类型系统。
推荐阅读
- azure - Azure powershell Move-AzureDeployment - 错误:HttpRequestException
- javascript - 从一个号码到另一个号码
- shell - 使用 gawk 添加以逗号分隔的值
- c# - 在非 UI 线程上运行 async/await 方法
- google-cloud-platform - 在程序中一致地处理多个用户输入和拉取图像的最佳方法是什么?
- ios - 如何防止 ActivityViewController 将“www”附加到共享链接
- python - Python组织url的CSV,每个url分割行,从url下载图像
- css - 带有 Sass 和悬停的动画不起作用?
- ios - 升级到 Xcode 12 后构建速度极慢
- jquery - 重定向到新页面后,将文本/元素/变量或其他内容添加到 div 元素中