当前位置: 代码迷 >> C# >> 为什么Convert.ToXXX可以工作,强制转型就抛错误
  详细解决方案

为什么Convert.ToXXX可以工作,强制转型就抛错误

热度:56   发布时间:2016-05-05 03:23:29.0
为什么Convert.ToXXX可以工作,强制转型就抛异常?
如题,我有下面的代码:

    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大。
  相关解决方案