120
Convert.ToString(null)

返回

null

正如我所料。

Convert.ToString(null as object)

返回

""

为什么这些不同?

4

2 回答 2

148

ToString这里有 2 个重载

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

C# 编译器本质上试图选择最具体的重载,它将与输入一起工作。值null可以转换为任何引用类型。在这种情况下string比更具体object,因此它将被选为获胜者。

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

C# 语言规范的第 7.4.3 节介绍了这种打破平局如何工作的真正令人毛骨悚然的细节。

于 2012-04-27T18:13:16.030 回答
65

JaredPar 出色的重载解决方案答案之后 - 问题仍然是“为什么Convert.ToString(string)返回 null,但Convert.ToString(object)返回string.Empty”?

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

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

Convert.ToString(object) 返回“value 的字符串表示形式,如果 value 为 null,则返回 String.Empty”。

编辑:至于这是否是“规范中的错误”、“非常糟糕的 API 设计”、“为什么要这样指定”等 - 我会试一试为什么我看不到的理由这很重要。

  1. System.Convert具有将每种基本类型转换为自身的方法。这很奇怪——因为不需要或不可能进行转换,所以这些方法最终只返回参数。Convert.ToString(string)行为相同。我认为这些是用于代码生成场景的。
  2. Convert.ToString(object)通过时有3个选择null。抛出、返回 null 或返回 string.Empty。投掷会很糟糕-假设这些用于生成的代码,情况会更加糟糕。返回 null 需要您的调用者进行 null 检查 - 同样,这在生成的代码中不是一个很好的选择。返回 string.Empty 似乎是一个合理的选择。其余System.Convert处理值类型 - 具有默认值。
  3. 返回 null 是否更“正确”值得商榷,但 string.Empty 肯定更有用。改变Convert.ToString(string)意味着打破“没有实际转换”的规则。由于System.Convert是静态实用程序类,因此每个方法都可以在逻辑上视为自己的方法。在现实世界中,这种行为应该“令人惊讶”的场景很少,所以让可用性战胜(可能的)正确性。
于 2012-04-27T18:30:33.323 回答