【问题标题】:C# Unable to cast object of type 'System.Double' to type 'System.Single'C# 无法将“System.Double”类型的对象转换为“System.Single”类型
【发布时间】:2019-07-19 07:41:27
【问题描述】:

在判断这个问题已经回答之前,请阅读描述。我在下面有这个简单的代码:

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”,因此它应该将其转换为浮点数,但事实并非如此。有趣的一点是,如果我用以下两行代码中的任何一个替换最后一行(“感兴趣的行”),它会成功地将双精度转换为浮点数

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

此方法将计算出基础类型并可以进行转换,但代价是计算类型转换时会降低性能。

【讨论】:

  • .. 因为字典正在映射double ...我猜
【解决方案2】:

我今天遇到了类似的问题,我的 SQL 实体映射为“float”,而我的 .Net 实体映射为“float”。我保留了 SQL 映射,但将 .Net 类型更改为“double”。

ADO.NET SQL Server Data Type Mappings 文档提供了所有类型的正确映射表。

【讨论】:

  • 当您使用 .Net 实体映射 SQL 实体时,这是一个非常好的解决方案,所以如果您遇到同样的问题,请检查一下
猜你喜欢
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多