为什么转换字符串(null)返回不同的值,如果你强制转换null

本文关键字:转换 null 如果 字符串 返回 为什么 | 更新日期: 2023-09-27 18:32:33

Convert.ToString(null)

返回

null

正如我所料。

Convert.ToString(null as object)

返回

""

为什么这些不同?

为什么转换字符串(null)返回不同的值,如果你强制转换null

这里有 2 个重载的ToString在起作用

Convert.ToString(object o);
Convert.ToString(string s);

C# 编译器实质上是尝试选择将与输入一起使用的最具体的重载。 null值可转换为任何引用类型。 在这种情况下,stringobject更具体,因此它将被选为获胜者。

null as object中,您已将表达式的类型固化为 object . 这意味着它不再与string重载兼容,编译器会选择object重载,因为它是唯一兼容的重载。

有关此平局如何工作的真正令人毛骨悚然的细节,请参见 C# 语言规范的第 7.4.3 节。

继 JaredPar 出色的重载分辨率答案之后 - 问题仍然是"为什么Convert.ToString(string)返回 null,但Convert.ToString(object)返回string.Empty"?

答案是...因为文档是这样说的:

Convert.ToString(string( 返回"指定的字符串实例;不执行实际转换"。

Convert.ToString(object( 返回"值的字符串表示形式,如果值为空,则返回 String.Empty"。

编辑:至于这是否是"规范中的错误","非常糟糕的API设计","为什么这样指定"等 - 我将尝试一些理由,为什么我认为这没什么大不了的。

  1. System.Convert具有将每个基类型转换为自身的方法。这很奇怪 - 因为不需要或不可能进行转换,因此方法最终只返回参数。 Convert.ToString(string)的行为是一样的。我认为这些是针对代码生成方案的。
  2. Convert.ToString(object)通过时有 3 个选择null。抛出、返回 null 或返回字符串。空。抛出会很糟糕 - 假设这些用于生成的代码,则更是如此。返回 null 需要调用方执行 null 检查 - 同样,在生成的代码中不是一个很好的选择。返回字符串。空似乎是一个合理的选择。System.Convert其余部分处理值类型 - 具有默认值。
  3. 返回 null 是否更"正确"但字符串是值得商榷的。空的肯定更有用。更改Convert.ToString(string)意味着打破"无实际转化"规则。由于System.Convert是一个静态实用程序类,因此每个方法都可以在逻辑上被视为自己的方法。在现实世界中,这种行为应该"令人惊讶",所以让可用性战胜(可能的(正确性。