C# Unable to cast object of type 'System.Double' to type 'System.Single'

24,128

Solution 1

When you add to the dictionary your double will be boxed, as the dictionary is mapping a string to an object.

When you unbox you must cast to the underlying type. In your case that underlying type is a double, so the cast to float will fail.

You can get around this by using Convert.ToSingle

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

This method will work out the underlying type and can do the conversion, at the expense of a performance hit when working out the type conversions.

Solution 2

I had a similar problem today with my SQL entity mapped as "float" and my .Net entity mapped as "float". I kept the SQL mapping, though changed the .Net types to "double".

The ADO.NET SQL Server Data Type Mappings documentation presents a table of the correct mapping for all types.

Share:
24,128
With A SpiRIT
Author by

With A SpiRIT

Updated on October 28, 2021

Comments

  • With A SpiRIT
    With A SpiRIT about 2 years

    before judging that this question is already answered, please read the description. I have this simple code below:

    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**
    

    When i execute this i get:

    TYPE OF OBJECT IS "System.Double" Exception thrown: 'System.InvalidCastException' in DevOpsAutomatedReporting.dll Unable to cast object of type 'System.Double' to type 'System.Single'.

    The exception is caused by the last line tagged "Line of interest". I can't really understand why the last line is causing this as the type of the object is inferred to be "System.Double" at runtime so it should've had cast it to a float but it doesn't. An interesting point is that if i replace the last line ("Line of interest") with either of the following two lines of code it successfully converts the double to 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"]);
    
  • Serg
    Serg over 4 years
    .. as the dictionary is mapping a double ... I guess
  • Martin Kinuthia
    Martin Kinuthia almost 2 years
    This is a very good solution when you're mapping SQL entity with .Net entity so if you're experiencing the same problem check it out