在判断此问题已得到回答之前,请阅读说明。我在下面有这个简单的代码:
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"]);
请对此予以启发。谢谢!
答案 0 :(得分:3)
当您添加到字典中时,由于字典将string
映射到object
,因此双精度字将被装箱。
取消装箱时,必须强制转换为基础类型。在您的情况下,基础类型是double
,因此对float
的转换将失败。
您可以使用Convert.ToSingle
解决此问题netPlannedHours = Convert.ToSingle(d["key"])
此方法将计算出基础类型并可以进行转换,但要以牺牲性能为代价来进行类型转换。