Convert.ToDouble中null值的行为不正确,可能吗

本文关键字:不正确 ToDouble null Convert | 更新日期: 2023-09-27 18:20:08

很奇怪,星期五我在公司的项目中工作,发现了一些"坏"代码或奇怪的代码。我说,我不相信微软框架中的错误。

我发现:

double? euros = null;
double test = Convert.ToDouble(euros);

此测试结果为0.0,而不是异常错误。

我很惊讶,因为我预料会有什么例外。

有人能告诉我为什么会发生这种事吗?

Convert.ToDouble中null值的行为不正确,可能吗

这一切都与Convert.ToDouble(object)方法的实现有关;

public static double ToDouble(object value)
{
     return value == null? 0: ((IConvertible)value).ToDouble(null);
}

如您所见,如果valuenull,则返回0

也记录为:;

返回值

双精度浮点数等价于值,或如果值为null则为零

有人能告诉我为什么会发生这种情况吗


因为这就是记录在案的行为:

无论是Convert.ToDouble(Object)还是Convert.ToDouble(Double),文档都非常清楚地指出:

(低于返回值)

等效于值的双精度浮点数,如果值为null则为零。

和往常一样,如果现实与预期不符,你应该做的第一件事就是检查你的预期是否与记录在案的行为相匹配。

它这样做可能有其真正的原因

有些人认为:


我不认为有好的理由让它这样做

这可能是有效的意见,但如果框架设计者真的认为归零是一个不理想的结果,他们应该做他们认为最好的事情。

很明显,一旦在.NET中定义了行为,就不能在以后的版本中更改它——但这与说它必须以与VB6相同的方式进行行为不同。

如果希望代码在值为null时抛出异常,则需要强制转换为double,而不是使用Convert.ToDouble()

下面的代码将抛出一个异常,这似乎是您想要的:

double? euros = null;
double test2 = (double)euros; // System.InvalidOperationException: 'Nullable object must have a value.'