C#无法将类型为“ System.Double”的对象转换为类型为“ System.Single”

时间:2019-07-19 07:41:27

标签: c# .net casting type-conversion precision

在判断此问题已得到回答之前,请阅读说明。我在下面有这个简单的代码:

Dictionary<string, object> d = new Dictionary<string, object>();

d.Add("key" , 30d);

System.Diagnostics.Debug.WriteLine($" TYPE OF OBJECT IS  \"{d["key"].GetType()}\"");

netPlannedHours = (float)d["key"];         ---> **Line of Interest**

当我执行此操作时,我得到:

  

对象类型为“ System.Double”引发的异常:   DevOpsAutomatedReporting.dll中的'System.InvalidCastException'无法   将类型为“ System.Double”的对象转换为类型为“ System.Single”。

该异常是由标记为“兴趣线”的最后一行引起的。我真的不明白为什么最后一行会导致这种情况,因为在运行时将对象的类型推断为“ System.Double”,因此它应该将其强制转换为浮点数,但事实并非如此。有趣的一点是,如果我用以下两行代码之一替换最后一行(“感兴趣的行”),它将成功将double转换为float

// Cast the double object to double again and then to float **WORKS**
netPlannedHours = (float)(double)d["key"];

// Convert to float using "Convert.ToSingle()"  **WORKS**
netPlannedHours = Convert.ToSingle(d["key"]);

请对此予以启发。谢谢!

1 个答案:

答案 0 :(得分:3)

当您添加到字典中时,由于字典将string映射到object,因此双精度字将被装箱。

取消装箱时,必须强制转换为基础类型。在您的情况下,基础类型是double,因此对float的转换将失败。

您可以使用Convert.ToSingle

解决此问题
netPlannedHours = Convert.ToSingle(d["key"])

此方法将计算出基础类型并可以进行转换,但要以牺牲性能为代价来进行类型转换。