以下代码在最后一次分配时失败:
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
,那么这个错误的原因是什么?
答案 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)
a
是int
,但b
是对int
对象的引用 - 它就是所谓的盒装int。它们是两个不同的东西,因此有不同的行为。