为什么Convert.ToXXX可以工作,强制转型就抛错误
为什么Convert.ToXXX可以工作,强制转型就抛异常?
如题,我有下面的代码:
运行结果是,Convert.ToDouble()可以无误的将obj从int类型转型到double类型,并输出,但是下面那句“var d=(double)obj”一执行就会抛出异常。这是为什么呢。用Convert静态函数和强制转型,这两种转型方法,在本质上有什么不同?
------解决思路----------------------
这行代码编译器做了神马?

------解决思路----------------------
要拨开云雾见青天,你就弄懂反汇编。
在堆上开辟一块内存,存放i值
把i取消装箱,放在一个另一块int内存块,从大内存块拿东西给小内存块,显然是行不通
------解决思路----------------------
也可以从类继承的角度理解
double的基类是object,派生类可以隐式转换成基类,基类不可以转换成派生类。
比如讲,object是人,double是男人
男人一定是人,人不一定是男人。
------解决思路----------------------
object i = 1;
var abc = i.GetType();
因为i本来就是int。你将int装double会报无效转换,虽然double范围比int大。
如题,我有下面的代码:
class Program
{
private static void Main()
{
object obj = 1;
Console.WriteLine(Convert.ToDouble(obj)); // why OK without exception?
var d = (double) obj; // why exception?
}
}
运行结果是,Convert.ToDouble()可以无误的将obj从int类型转型到double类型,并输出,但是下面那句“var d=(double)obj”一执行就会抛出异常。这是为什么呢。用Convert静态函数和强制转型,这两种转型方法,在本质上有什么不同?
------解决思路----------------------
var d = (double) obj;
这行代码编译器做了神马?
------解决思路----------------------
要拨开云雾见青天,你就弄懂反汇编。
object i = 1;
在堆上开辟一块内存,存放i值
(double)i;
把i取消装箱,放在一个另一块int内存块,从大内存块拿东西给小内存块,显然是行不通
------解决思路----------------------
也可以从类继承的角度理解
double的基类是object,派生类可以隐式转换成基类,基类不可以转换成派生类。
比如讲,object是人,double是男人
男人一定是人,人不一定是男人。
------解决思路----------------------
object i = 1;
var abc = i.GetType();
因为i本来就是int。你将int装double会报无效转换,虽然double范围比int大。