EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

C#引用转换

引用转换

 

✦ 一个对象的引用可以隐式的转换到其父类的引用(向上转换)。
✦ 想转话到子类的引用则需要显式转换(向下转换)。
✦ 引用转换:创建了一个新的引用,它也指向同一个对象。

 

向上转换

 

从子类的引用创建父类的引用

Man man = new Man();
Creature a=man;   //  This is called Upcast

 

变量a依然指向同一个Man对象(man也指向它)

Console.WriteLine(a==man);   // True

 

唯一的区别是

a和man虽然指向同一个对象,但a的可视范围更小,

即a只能.Name属性,从a这里是拿不出man的其他属性的。

 

向上转换的应用情景,具体在于,

你手上有一个被实例化的子类,

你的需求是只要其父类的一部分属性,而子类的属性你是完全不需要的。

 

虽然这种说法过于抽象,但是到了具体情景会用到的。(具体的大项目)

 

向下转换

 

接着上面的来

Man man = new Man();
man.Name = "Mike";
man.OtherFeature = 20;
Creature a=man;   //  This is called Upcast
Man m=(Man)a;    //  This is called Downcast
Console.WriteLine(m.OtherFeature);   // <No error>
Console.WriteLine(m==a);   // True
Console.WriteLine(m==man);  //True

输出:

20

True

True

 

查看局部变量:

 

完全一致

 

是的,

在执行如上图蓝字标识的,

向下转换,

实际上让m指向了man变量,并且可视化范围扩大了。

 

向上转换是隐式转换,向下转换是显示转换。

 

什么是隐式转换?什么是显示转换?

 

一句话:

直接等于的就是隐式转换,需要加括号的是显示转换。

需要加括号的,也称为强制转换

 

✦ 向下转换和向上转换一样,只涉及到引用,不涉及底层对象。

 

打个比方,把蓝字改成

Cat c = (Cat)a;

一定会转换失败,因为Cat下面的属性类型与Man是不一致的。

 

需要显示转换,因为可能会失败。(这里的需要,是强制要求的,因为你不写就会报错)

 

写了,会因为 转换失败而报错。

 

强制转换这种语法要求,就是为了减少错误而规定的。

 

This article was last edited at 2020-03-12 05:49:48

* *