【问题标题】:Why does Convert.ToString(null) return a different value if you cast null?如果转换为 null,为什么 Convert.ToString(null) 会返回不同的值?
【发布时间】:2012-04-27 18:10:18
【问题描述】:
Convert.ToString(null)

返回

null

正如我所料。

但是

Convert.ToString(null as object)

返回

""

为什么这些不同?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    这里有两个 ToString 重载

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

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

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

    C# 语言规范的第 7.4.3 节介绍了这种平局如何运作的真正令人毛骨悚然的细节。

    【讨论】:

    • 好的。所以它使用一个重载而不是另一个。说得通。但是两个重载不应该返回相同的东西吗? +1 顺便说一句。
    • @JohnMacIntyre - 这取决于开发团队而不是编译器。
    • @JohnMacIntyre 如果您查看Convert.ToString(string) 的实现,它只是一个身份函数,而Convert.ToString(object) 实际上经历了更难遵循的路径。乍一看,我同意它们应该返回相同的结果,但 BCL 的可转换层并不是我非常了解的东西,并且可能有充分的理由造成差异(尽管我持怀疑态度)
    • 我来这里是为了寻找如何将空对象转换为空字符串。其他搜索者的答案是(string)null,或者如果你的对象被称为o,那么(string)o
    【解决方案2】:

    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) 通过null 时有 3 个选择。抛出、返回 null 或返回 string.Empty。投掷会很糟糕-假设这些用于生成的代码,情况会更加糟糕。返回 null 需要您的调用者进行 null 检查 - 同样,这在生成的代码中不是一个很好的选择。返回 string.Empty 似乎是一个合理的选择。 System.Convert 的其余部分处理具有默认值的值类型。
    3. 返回 null 是否更“正确”值得商榷,但 string.Empty 肯定更有用。更改Convert.ToString(string) 意味着打破“无实际转换”规则。由于System.Convert 是一个静态实用程序类,因此每个方法在逻辑上都可以视为自己的方法。在现实世界中,这种行为应该“令人惊讶”的场景很少,所以让可用性战胜(可能的)正确性吧。

    【讨论】:

    • 可以说这是规范中的错误吗?
    • 这并不能回答为什么会这样。说它的行为是这样的,因为它被记录为这样的行为是重言式的。
    • @JohnMacIntyre IMO 可以说这是非常糟糕的 API 设计。
    • @CodeInChaos - 不是重言式,除非您假设文档是在 BCL 开发后基于可观察行为编写的。我认为这将是一个奇怪的假设。 IOW,它不是“记录为这样的行为”,而是“记录了它的行为方式” - 即,它是“指定的行为方式”。
    • 它只是将问题转移到“为什么它被指定为这样的行为”
    猜你喜欢
    • 2012-06-20
    • 2016-12-28
    • 2015-12-30
    • 2018-11-28
    • 2013-08-09
    • 2013-06-05
    • 2014-05-23
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多