Convert.ToString返回string.empty而不是null

5

我发现了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 ("")

在我看来,这似乎是一个bug,因为当我将输入转换为字符串并且输入为NULL时,结果应该是字符串的默认值,即NULL。


根据 msdn 上的信息:https://msdn.microsoft.com/zh-cn/library/astxcyeh(v=vs.110).aspx,它会按照所告知的返回。 - Swamy
我知道,但我不明白为什么他们想在相同的输入上以不同的方式执行他们的方法。 - Benjamin Schäublin
DBNull 重写了 ToString 和 IConvertible.ToString 方法,它们都返回 string.Empty。你确定你的结果吗?因为 Convert.ToString(IConvertible) 委托给了这些方法。如果 Convert.ToString((string)null) 只是返回参数(参考源支持此操作),那么这是有道理的。Convert.ToString(object) 的源代码在其为 null 时返回 string.Empty。 - pinkfloydx33
没错,是我的错 - 所以只是字符串重载的行为不同。我编辑了我的问题并将其中一个答案标记为解决方案。 - Benjamin Schäublin
2个回答

14

我刚刚确实在查看那个代码,以及有关字符串输入的部分。 :) - ProgrammingLlama
感谢大家提供文档和代码。我现在知道它是这样编码的。但在我看来,它有点可疑和不一致。 - Benjamin Schäublin
你是对的 - 那就是我的错了。但在我看来,它们仍然不一致。因为它们接收相同的输入值(字符串 NULL 和对象 NULL),但行为不同。 - Benjamin Schäublin
@maerlin 参考源代码中有一条注释,它说“跳过空检查”,这是有道理的。你知道你有一个字符串类型的参数,所以只需返回它即可。调用 Convert.ToString(string) 没有意义,因为它本质上是一个方法调用掩盖的无操作。https://referencesource.microsoft.com/#mscorlib/system/convert.cs,62a50ad9f30e9ac2 - pinkfloydx33
@Freggar,这是在合同行上,我认为它是参考下面的行。我怀疑代码合同是在比原始框架晚得多的时候添加的(虽然只是猜测)。将Contract.Ensures与其他执行!=null的方法进行比较,而这些方法则执行==value - pinkfloydx33
显示剩余3条评论

9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接