Convert.ToString(null)
Run Code Online (Sandbox Code Playgroud)
回报
null
Run Code Online (Sandbox Code Playgroud)
正如我所料.
但
Convert.ToString(null as object)
Run Code Online (Sandbox Code Playgroud)
回报
""
Run Code Online (Sandbox Code Playgroud)
为什么这些不同?
Jar*_*Par 142
这里有2个重载ToString
发挥作用
Convert.ToString(object o);
Convert.ToString(string s);
Run Code Online (Sandbox Code Playgroud)
C#编译器本质上试图选择最适合输入的特定重载.甲null
值转换为任何引用类型.在这种情况下string
更具体object
,因此它将被选为胜利者.
在null as object
你已经将表达式的类型固化为object
.这意味着它不再与string
重载兼容,并且编译器会选择object
重载,因为它是剩余的唯一兼容的.
C#语言规范的第7.4.3节介绍了这种打破这种打破方式的真正细节.
Mar*_*ett 65
继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)
表现相同.我认为这些是代码生成场景.Convert.ToString(object)
通过时有3个选择null
.抛出,返回null或返回string.Empty.抛出会很糟糕 - 假设这些用于生成代码的假设是双倍的.返回null需要您的调用者进行空检查 - 再次,在生成的代码中不是一个很好的选择.返回string.Empty似乎是一个合理的选择.其余的System.Convert
处理值类型 - 具有默认值.Convert.ToString(string)
意味着打破"无实际转换"规则.由于System.Convert
是静态实用程序类,因此每个方法都可以在逻辑上视为自己的方法.现实世界的情况很少,这种行为应该是"令人惊讶的",所以让可用性赢得(可能)正确性. 归档时间: |
|
查看次数: |
31591 次 |
最近记录: |