很奇怪,周五我在公司的项目中工作,我找到了一些"坏"代码或好奇的代码。我说,我不相信Microsoft Framework中的错误。
我发现:
double? euros = null;
double test = Convert.ToDouble(euros);
此测试结果为0.0而不是异常错误。
我很惊讶,因为我期待某种例外。
有人可以告诉我为什么会这样吗?
答案 0 :(得分:10)
所有关于Convert.ToDouble(object)
方法的implemented;
public static double ToDouble(object value)
{
return value == null? 0: ((IConvertible)value).ToDouble(null);
}
如您所见,如果0
为value
,则会返回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.'