class c1 {...}
class c2:c1{...}
c2 b = new c2();
c1 a = b;//此时认为a是什么类型 是c1 OR c2 ?
Console.WriteLine(b.getype());//显示为类型c2
Console.WriteLine(a.getype());//显示为类型c2
c2 c = (c2)a; //问题是为什么类型都为c2时 两个对象实例却要转换而且还是显示转换"(c2)" 
我想这个问题不是装箱拆箱的问题 
哪位朋友给讲一下 感谢了

解决方案 »

  1.   

    to c1 a = b;//此时认为a是什么类型 是c1 OR c2 ?由于class定义的类型属于引用类型,所以在做如上操作的时候,系统默认提供从子类对象转向父类对象的函数,但是由于复制操作并不是copy,而是对象引用,因此真正对象的类型还是c2。
      

  2.   

    to c2 c = (c2)a; //问题是为什么类型都为c2时 两个对象实例却要转换而且还是显示转换"(c2)" 这是必须的,因为从基类对象转为子类对象,系统并没有默认的转换工具,虽说a的运行状态时候的类型是c2,但是转换是在编译的时候,所以这里必须是强转。
      

  3.   

    有两个类型的概念,变量类型(声明类型)和对象类型(运行时类型)。变量类型即声明变量的类型,这个类型决定了你能对这个变量进行什么操作,如你不能对int型的执行AddDays操作。对象类型才是实际的类型,如果你将一个派生类的对象赋给了基类变量,那么变量的类型是基类而对象的类型是派生类的,其实你可以对这个变量进行派生类才有的一些操作,但C#强类型检查语法不允许你这样,你必须先通过强制类型转换把他放到一个派生类类型的变量中去。这里只是说了C#强类型的语法检查,关于强类型的特性和这样做有什么用处你需要参阅更多的资料,关于强类型检查这个概念不是三言两语能说明白了。