Convert.ToDouble中空值的行为不正确,是否可能?

时间:2014-08-30 17:31:46

标签: c#

很奇怪,周五我在公司的项目中工作,我找到了一些"坏"代码或好奇的代码。我说,我不相信Microsoft Framework中的错误。

我发现:

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

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

我很惊讶,因为我期待某种例外。

有人可以告诉我为什么会这样吗?

3 个答案:

答案 0 :(得分:10)

所有关于Convert.ToDouble(object)方法的implemented;

的全部内容
public static double ToDouble(object value)
{
     return value == null? 0: ((IConvertible)value).ToDouble(null);
}

如您所见,如果0value,则会返回null

另外documented as;

  

返回值

     

双精度浮点数   相当于值,,如果值为null,则为零

答案 1 :(得分:8)

有人可以告诉我为什么会这样吗?


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

无论是Convert.ToDouble(Object)还是Convert.ToDouble(Double),文档都说得很清楚:

(在返回值下)

  

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

与往常一样,如果现实与期望不符,那么您应该做的第一件事就是检查您的期望是否符合记录的行为。

它可能有一个真正的原因,它的行为就是这样。

有些人争辩说:


我认为

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

显然,一旦行为在.NET中定义,就无法为以后的版本进行更改 - 但这与说它必须以与VB6相同的方式不一样。

答案 2 :(得分:0)

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

以下代码引发异常,这似乎是您想要的:

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