如果转换为null,为什么Convert.ToString(null)返回不同的值?

时间:2012-04-27 18:10:18

标签: c# .net

Convert.ToString(null)

返回

null

正如我所料。

但是

Convert.ToString(null as object)

返回

""

为什么这些不同?

2 个答案:

答案 0 :(得分:140)

ToString有两个重载在这里发挥作用

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

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

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

C#语言规范第7.4.3节介绍了这种打破这种打破方式的真正细节。

答案 1 :(得分:64)

继续JaredPar's excellent overload resolution回答 - 问题仍然是“为什么Convert.ToString(string)会返回null,但Convert.ToString(object)会返回string.Empty”?

答案就是......因为the docsso

  

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

     

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

编辑: 至于这是否是“规范中的错误”,“非常糟糕的API设计”,“为什么它被指定为这样”等等 - 我将采取一些理由来解释为什么我不认为它很重要。

  1. System.Convert具有将每种基本类型转换为本身的方法。这很奇怪 - 因为不需要或不可能进行转换,所以方法最终只返回参数。 Convert.ToString(string)行为相同。我认为这些是代码生成方案。
  2. 通过Convert.ToString(object)后,
  3. null有3个选项。抛出,返回null或返回string.Empty。抛出会很糟糕 - 假设这些用于生成代码的假设是双倍的。返回null需要您的调用者进行空检查 - 再次,在生成的代码中不是一个很好的选择。返回string.Empty似乎是一个合理的选择。 System.Convert的其余部分处理值类型 - 它们具有默认值。
  4. 返回null是否更“正确”是值得商榷的,但string.Empty肯定更有用。更改Convert.ToString(string)意味着违反“无实际转化”规则。由于System.Convert是一个静态实用程序类,因此每个方法都可以在逻辑上视为自己的方法。现实世界的情况很少,这种行为应该是“令人惊讶的”,所以让可用性赢得(可能)正确性。