【问题标题】:Convert.ToString returns string.empty instead of nullConvert.ToString 返回 string.empty 而不是 null
【发布时间】:2018-11-28 03:13:54
【问题描述】:

我发现了 Convert.ToString 的一个奇怪行为,我想了解它为什么会这样。

看看下面的代码片段:

string obj = null;
var str = Convert.ToString(obj);
Console.WriteLine(str); // CORRECT: returns null;

到目前为止一切都很好,但是:

DBNull obj = DBNull.Value;
var str = Convert.ToString(obj);
Console.WriteLine(str); // ???: returns string.Empty ("")

object obj = null;
var str = Convert.ToString(obj);
Console.WriteLine(str); // ???: returns string.Empty ("")

在我看来它像一个错误,因为当我转换为字符串并且输入为 NULL 时,结果应该是字符串的默认值,它也是 NULL。

【问题讨论】:

  • 按照这里的 msdn:msdn.microsoft.com/en-us/library/astxcyeh(v=vs.110).aspx,它正在返回。
  • 我知道,但我不明白他们为什么要在相同的输入上表现出不同的方法。
  • DBNull 覆盖 ToString 和 IConvertible.ToString 并且它们都返回 string.Empty。您确定那里的结果吗,因为 Convert.ToString(IConvertible) 委托给这些方法。 Convert.ToString((string)null) 只返回参数是有道理的(并且参考源支持这一点)。如果为 null,则 Convert.ToString(object) 的源返回 string.Empty
  • 对,我的错 - 所以只是字符串重载的行为不同。我编辑了我的问题并检查了其中一个答案作为解决方案。

标签: c# string type-conversion


【解决方案1】:

这是记录在案的行为

Convert.ToString Method (Object)

value 的字符串表示形式,如果 value 为 null,则为 String.Empty。


Convert.ToString Method (String)

原样返回值。

【讨论】:

    【解决方案2】:

    Convert.ToStringa String overload that does nothing

    返回指定的字符串实例;没有执行实际的转换。

    its Object overload 是这样定义的:

    value 的字符串表示形式,如果 valuenull,则为 String.Empty

    这可能有点令人惊讶,但首先没有理由在String 表达式上使用Convert.ToString

    【讨论】:

    • 我只是在看the codestring input :)
    • 感谢大家提供的文档和代码。我现在知道,那是这样编码的。但在我看来它有点可疑和不一致。
    • @maerlin DBNull.Value 也为我返回 String.Empty,所以看起来很一致。
    • 你是对的 - 那是我的错......但仍然不一致(至少在我看来)。因为它们接收相同的输入值(字符串 NULL 和对象 NULL)并且行为不同。
    • @maerlin 参考源有一条评论说“跳过空值检查”,这是有道理的。你知道你有一个字符串类型的参数,所以只需返回它。无论如何调用 Convert.ToString(string) 是没有意义的,它本质上是一个隐藏在方法调用后面的无操作。 referencesource.microsoft.com/#mscorlib/system/…
    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多