Convert.ToString(null)
返回
null
正如我所预料的。
但是
Convert.ToString(null as object)
返回
""
为什么它们不同?
这里涉及到2个重载的ToString
Convert.ToString(object o);
Convert.ToString(string s);
C#编译器会尝试选择与输入最匹配的重载。 null
可以转换为任何引用类型。在这种情况下,string
比 object
更具体,因此将被选为赢家。null as object
中,您已将表达式的类型确定为 object
。这意味着它不再与 string
重载兼容,编译器会选择 object
重载,因为它是仅剩的兼容重载。在跟进JaredPar的重载解析回答之后 - 问题仍然存在,“为什么Convert.ToString(string)
返回null,而Convert.ToString(object)
返回string.Empty
?”
Convert.ToString(string)
返回“指定的字符串实例;不执行任何实际转换。”
Convert.ToString(object)
返回“value的字符串表示形式,如果value为null,则返回String.Empty。”
编辑: 至于这是否是“规范中的错误”、“非常糟糕的API设计”、“为什么要这样指定”,等等。-我会尝试解释一下为什么我认为这不是什么大问题。
System.Convert
有将每个基本类型转换为它本身的方法。这很奇怪 - 因为不需要或无法进行转换,所以这些方法最终只返回参数。 Convert.ToString(string)
也是如此。我假设这些方法是为了代码生成方案而存在的。null
时,Convert.ToString(object)
有3种选择。抛出异常、返回null或返回string.Empty。抛出异常会很糟糕 - 在假定这些被用于生成的代码的情况下尤其如此。返回null要求你的调用者进行null检查 - 再次,在生成的代码中不是一个很好的选择。返回string.Empty似乎是一个合理的选择。其他的System.Convert
处理值类型 - 它们有一个默认值。object
重载返回null
实际上在技术上是可行的。它规定当输入为null
时不返回null
,但当输入不为null
时,它会调用输入的.ToString()
方法。该方法可以被覆盖以返回null
。这可能不是一个好主意,但它不会违反运行时的任何规则。使用class ToStringNull { public override string ToString() { return null; } }
,您将从Convert.ToString(new ToStringNull())
获得一个null
。 - Jonathan Gilbert
Convert.ToString(string)
的实现,它只是一个恒等函数,而Convert.ToString(object)
实际上经过了一条更难以跟踪的路径。乍一看,我同意它们应该返回相同的结果,但是BCL中可转换层并不是我很了解的东西,有可能存在这种差异的良好原因(虽然我表示怀疑)。 - JaredPar(string)null
,或者如果你的对象叫做o,那么就是(string)o
。 - rayzinnz