以下代码在最后一次分配时失败:
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
,这个错误的原因是什么?
这是一个非常常见的问题。请参阅 https://ericlippert.com/2009/03/03/representation-and-identity/ 获取解释。
片段:
我收到了很多关于 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;
这是
System.Convert
派上用场的罕见情况之一。如果您事先不知道它会是System.Convert.ToDouble(obj)
,您可以使用int
将其敲掉。
隐式转换是编译时操作。对于
b
类型的 object
来说这是不可能的。
a
是一个 int
,但 b
是对 int
对象的引用 - 这就是所谓的装箱 int。它们是两个不同的东西,因此有不同的行为。