C#int-或object-to-double cast错误解释

dig*_*dig 8 c# double int casting

以下代码在最后一次分配时失败:

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;
}
Run Code Online (Sandbox Code Playgroud)

如果a和b都是int,那么这个错误的原因是什么?

Eri*_*ert 24

这是一个非常常见的问题.有关说明,请参见http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx.


片段:

我收到了很多关于C#cast运算符的问题.我得到的最常见的问题是:

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?
Run Code Online (Sandbox Code Playgroud)

为什么?因为盒装T只能取消装箱T.(*)一旦它被取消装箱,它只是一个可以像往常一样投射的值,所以双投射效果很好.

(*)或Nullable<T>.


Bro*_*ass 16

取消装箱需要确切的类型 - 您可以这样做:

double y = (double)(int)b;
Run Code Online (Sandbox Code Playgroud)


rah*_*cks 7

System.Convert这是派上用场的罕见情况之一。如果您事先不知道它会发生,您可以使用System.Convert.ToDouble(obj)将其击倒int