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