C#内部 - 或对象,以双铸造的错误解释(C# int- or object-to-double c

2019-09-16 21:55发布

下面的代码失败在最后的分配:

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 ,这是什么错误的原因是什么?

Answer 1:

这是一个非常常见的问题。 见http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx一个解释。


片段:

我得到了相当数量的关于C#转换运算符的问题。 最常见的问题,我得到的是:

 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>



Answer 2:

拆箱需要的确切类型 - 你可以这样做,而不是:

double y = (double)(int)b;


Answer 3:

隐式转换是一个编译时的操作。 这是不可能的b类型的object



Answer 4:

这是在哪里System.Convert就派上用场了罕见的案例之一。 您可以使用System.Convet.ToDouble(OBJ)敲出来,如果你不事先知道,这将是int。



Answer 5:

aint ,而b是一个对象,它是一个参考int -这是所谓的装箱的int。 这是两个不同的东西,因此,不同的行为。



文章来源: C# int- or object-to-double casting error explanation