下面的代码失败在最后的分配:
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
,这是什么错误的原因是什么?
下面的代码失败在最后的分配:
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
,这是什么错误的原因是什么?
这是一个非常常见的问题。 见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>
拆箱需要的确切类型 - 你可以这样做,而不是:
double y = (double)(int)b;
隐式转换是一个编译时的操作。 这是不可能的b
类型的object
。
这是在哪里System.Convert就派上用场了罕见的案例之一。 您可以使用System.Convet.ToDouble(OBJ)敲出来,如果你不事先知道,这将是int。
a
是int
,而b
是一个对象,它是一个参考int
-这是所谓的装箱的int。 这是两个不同的东西,因此,不同的行为。