为什么Convert.ToString(null)返回一个不同的值,如果你投了null?

Convert.ToString(null) 

回报

 null 

正如我所料。

 Convert.ToString(null as object) 

回报

 "" 

为什么这些不同?

这里有两个ToString重载

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

C#编译器本质上试图挑选最适合input的特定超载。 null值可以转换为任何引用types。 在这种情况下, stringobject更具体,因此它将被选为胜利者。

null as objectnull as object已经将expression式的types固化为object 。 这意味着它不再与string重载兼容,编译器会selectobject重载,因为它是唯一的兼容的。

C#语言规范第7.4.3节介绍了如何实现这种打破僵局的细节。

inheritance自JaredPar出色的重载parsing答案 – 问题依然存在:“为什么Convert.ToString(string)返回null,但Convert.ToString(object)返回string.Empty ”?

而答案是…因为文件是这样说的:

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

Convert.ToString(object)返回值“的string表示forms,如果值为null,则返回String.Empty。

编辑:至于这是一个“规范中的错误”,“非常糟糕的APIdevise”,“为什么这样指定”等 – 我会为了我为什么不看这是一个大问题。

  1. System.Convert具有将每个基types转换为自身的方法 。 这很奇怪 – 因为不需要或不可能进行转换,所以方法最终只返回参数。 Convert.ToString(string)行为相同。 我认为这是代码生成场景。
  2. 当传递null时, Convert.ToString(object)有3个select。 抛出,返回null,或者返回string.Empty。 投掷会是不好的,加上这些用于生成代码的假设。 返回null需要你的调用者做一个空检查 – 再一次,在生成的代码中不是一个好的select。 返回string.Empty似乎是一个合理的select。 System.Convert的其余部分处理值types – 具有默认值。
  3. 返回null是否更“正确”是值得商榷的,但string.Empty肯定更有用。 更改Convert.ToString(string)意味着打破“没有实际的转换”规则。 由于System.Convert是一个静态工具类,每个方法可以在逻辑上视为自己的方法。 现实世界中很less有这种行为应该是“令人惊讶的”,所以让可用性胜过(可能的)正确性。