Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# int- or object-to-double casting error explanation

The below code fails at the last assignment:

static void Main(string[] args)
{
    int a = 5;
    object b = 5;

    System.Diagnostics.Debug.Assert( a is int && b is int );

    double x = (double)a;
    double y = (double)b;
}

If both a and b are int, what is the cause of this error?

like image 332
digdig Avatar asked Apr 30 '12 16:04

digdig


4 Answers

This is one of the rare cases where System.Convert comes in handy. You can use System.Convet.ToDouble(obj) to knock it out if you don't know before hand that it will be int.

like image 154
rahicks Avatar answered Nov 04 '22 14:11

rahicks


Unboxing requires the exact type - you can do this instead:

double y = (double)(int)b;
like image 28
BrokenGlass Avatar answered Nov 04 '22 15:11

BrokenGlass


This is an extremely frequently asked question. See https://ericlippert.com/2009/03/03/representation-and-identity/ for an explanation.


Snippet:

I get a fair number of questions about the C# cast operator. The most frequent question I get is:

short sss = 123;
object ooo = sss;            // Box the short.
int iii = (int) sss;         // Perfectly legal.
int jjj = (int) (short) ooo; // Perfectly legal
int kkk = (int) ooo;         // Invalid cast exception?! Why?

Why? Because a boxed T can only be unboxed to T. (*) Once it is unboxed, it’s just a value that can be cast as usual, so the double cast works just fine.

(*) Or Nullable<T>.

like image 25
Eric Lippert Avatar answered Nov 04 '22 14:11

Eric Lippert


Implicit casting is a compile-time operation. It's not possible for b of type object.

like image 2
tech-man Avatar answered Nov 04 '22 14:11

tech-man