以前看过c++,对类型转换都是从内存分配的角度理解的。
开始c#也从内存分配理解的,但越搞越接近IL,接近c#编译原理,限于知识有限,归纳不出它的转换规则(才知道c++当时也学的是一知半解)。查过些书,但都没有全面的讲解的。感觉走进了误区。退而求其次,不要求从内存分配上求知,只希望给出使用级别上,c#的转化规则,要全面的。还有类型转换与类型兼容之间的关系,is和 as关键字的用法 (“兼容”就是对象是该类型或者是派生于该类型,这种表象 简单的回答,也就不用回答了)还有拆箱和装箱中类型的转换个人认为,以上涉及的类型转换等问题 其本质上都是一样的 或者说是同一个问题
我也查了很多书,只是简单的说什么 派生类隐式的转化为派生类之类的,就免于留言吧!高手可以回答下 表面的类型转换在底层内存上的变化机制
为了便于回答,下面是书上的例子,有真知灼见的哥们可以参考着回答下。
class B
{ }
class D:B
{ }
static void Main(string[] args)
{
OK 不能通过编译 执行异常
object o1 = new object(); *
object o2 = new B(); *
object o3 = new D(); *
object o4 = o3; *
B b1 = new B(); *
B b2 = new D(); *
D d1 = new D(); *
B b3 = new object(); *
D d2 = new object(); *
B b4 = d1; *
D d3 = b2; *
D d4 = (D)d1; *
D d5 = (D)b2; *
D d6 = (D)b1; *
B b5 = (B)o1; *
B b6 = (D)b2; *
}这个问题烦了我很多天了,希望大家能给出全面的讲解,或在什么地方有类似详细全面的理解!!!
初涉.NET不久,这块知识点周围同学都觉得理所当然,没什么问题。可我偏偏过不去这个坎,他们又解答不了我的问题。应该是c++留下来的毛病,过分关注内存。但我总得在一定层面上要理解后识记住他的用法啊,不想死记硬背。
拍拖了,小弟不甚感激!
解决方案 »
- 数据结构高手来帮我做下
- Groupbox事件触发的问题!
- 有没有做过,或者熟悉.NET Enterprise Services 的朋友?
- 关于windows application 弹出消息窗口的两个问题?
- 求助 用WM6 SDK 自带的C#程序读取GPS数据问题 经纬度无变化
- 如何在包含类库的解决方案里添加一个控制台应用程序?
- 圆内接正多边形中心点、圆半径、多边形任意一顶点坐标,求其它顶点坐标!!!!!!!
- 在线等,急,谢谢
- 单元测试用例
- 怎样在OnKeyPress(object sender KeyPressEventArgs e)中响应功能键,如:F1...F12等.
- 紧急求助,数据库问题
- frameset 的问题,哥哥姐姐们帮忙
子类里有一个区域放的父类的实例,子类内存区里有一个this指针,指向了这个内存区里包括的父类实例区,当把引用付给父类时,是把子类内存区里面的父类实例区域的引用给了父类的实例.
而c#采用迟绑定技术,执行的时候会执行相应的函数。至于类型转换,编译期间是没有实际的类型转换,只是c#语言是强类型语言,对安全要求看的很重,进行了一些强制的规定,B b2 = new D(); //这种子类对象赋给父类对象是肯定可以通过编译的。而反过来肯定不行,相反,如果两个类之间没有任何关系,如果我们定义了强制转换函数,编译器也会智能的通过编译。
B b3 = new object(); //编译器会认为肯定不能把object对象给B类型对象,因此编译出错!把子类的给父类也同样通不过编译。真要好好了解内存分配,还是好好看看c++方面的书,c#是从c++基础上过来的,感觉除了单继承不一样外,其余c++和c#的内存分配方式基本还是一致的。个人所想,有误勿怪!
在传递对象的引用时,如果类型不同则需要进行转换,一种类型可以隐式转换为其基类型,反之则需要显式转换,这种转换只是形式上的,对象本身并不发生任何变化。对象内部记录着该对象实际的类型,在进行转换时会对类型进行检查,变量可以保存其同类型或派生类型的对象的引用,如果要保存其它类型(包括其基类型)的对象的引用,则会产生异常。
A包含B
A是B的子类 :内存中开辟一个A 把B复制进A里
A可以转成B : 指向A里面的B而已object是所有的父类 可以理解成所有实例中都包含object吧我在书上看的 我是初学者
如果去掉你自己的黄镜片(object a=(object)new B()),你现在看到啥了,他成红色了(东西还是那个东西,不过你戴的是红镜片)再加上黄镜片 B=(B)a;(现在呢 红+黄=橙,他又回橙色了)