以下代码在最后一次分配中失败:
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# 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>
.
拆箱需要确切的类型 - 您可以这样做:
double y = (double)(int)b;
这是 System.Convert 派上用场的罕见情况之一。如果您事先不知道它将是 int,则可以使用 System.Convet.ToDouble(obj) 将其淘汰。
隐式转换是一种编译时操作。b
type是不可能的object
。
a
是 an int
,但是b
是对 an 对象的引用int
- 这就是所谓的装箱 int。它们是两种不同的事物,因此具有不同的行为。