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

时间:2012-04-30 16:34:38

标签: c# casting int double

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

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;
}

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

5 个答案:

答案 0 :(得分:21)

这是一个非常常见的问题。有关说明,请参阅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?
     

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

     

(*)或Nullable<T>

答案 1 :(得分:15)

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

double y = (double)(int)b;

答案 2 :(得分:2)

隐式转换是一个编译时操作。 b类型的object无法使用。

答案 3 :(得分:1)

这是System.Convert派上用场的罕见案例之一。你可以使用System.Convet.ToDouble(obj)来解决它,如果你事先不知道它将是int。

答案 4 :(得分:0)

aint,但b是对int对象的引用 - 它就是所谓的盒装int。它们是两个不同的东西,因此有不同的行为。