11

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

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

4

5 回答 5

25

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

于 2012-04-30T16:36:56.180 回答
17

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

double y = (double)(int)b;
于 2012-04-30T16:36:45.060 回答
4

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

于 2018-04-18T21:04:59.437 回答
2

隐式转换是一种编译时操作。btype是不可能的object

于 2012-04-30T16:46:20.637 回答
0

a是 an int,但是b是对 an 对象的引用int- 这就是所谓的装箱 int。它们是两种不同的事物,因此具有不同的行为。

于 2012-04-30T16:38:48.113 回答