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

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

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"]);

请对此有所启发。谢谢!

参考方案

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

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

您可以使用Convert.ToSingle解决此问题

netPlannedHours = Convert.ToSingle(d["key"])

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

错误:无法将类型为“ System.Int32”的对象转换为类型为“ System.String”的对象 - c#

我已经完成了完美的编码注册页面,登录代码,现在UpdateCustomer页面有错误-背景信息:我正在使用Microsoft Access作为数据源 LabelState.Text = (string)Session["sState"]; LabelPostalCode.Text = (string)Session["sPost…

System.out.printf不打印整数参数 - java

我是Java编程的新手,无法从另一个类返回方法。这两个类都可以编译并成功运行。我可以从一个类中调用一个简单的int,但是当我想计算用户输入的两个输入整数时,我只会得到一个空格。这是我的计算课class calculations { public final int AGE = 53; public int numbers(int num1, int num2…

System.Text.Json合并两个对象 - c#

是否可以用System.Text.Json?合并两个这样的json对象对象1{ id: 1 william: "shakespeare" } 对象2{ william: "dafoe" foo: "bar" } 结果对象{ id: 1 william: "dafoe" foo: …

System.IdentityModel.Selectors.UserNamePasswordValidator不存在 - c#

Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以使溢出。 6年前关闭。 on-topic 我试图从System.IdentityModel.Selectors.UserNamePasswordValidator派生一个类。但是,如果我…

更新包后,对象引用未设置为_Layout.cshtml中的对象实例 - c#

在我通过以下方式更新所有NuGet软件包之前,项目运行良好NuGet Manager(我正在尝试获取最新的OWIN软件包)。此错误在_Layout.cshtml中,我完全没有涉及。 你调用的对象是空的。 说明:在执行期间发生未处理的异常 当前的Web请求。请查看堆栈跟踪以获取更多信息 有关错误及其在代码中起源的信息。 异常详细信息:System.NullRe…