C#学习笔记四(转换1)_Zenki--的博客-CSDN博客
引用转换:引用类型对象由内存中的引用和数据组成。
(1)引用类型间的转换会把引用“标记”为其他类型。
(2)目标类型作为父类不会看到源类型子类的扩展部分。
class A { public int Field1; }
class B:A { public int Field2; }
static void Main(string[] args)
{
B myVar1 = new B();
A myVar2 = (A)myVar1;
Console.WriteLine($"{myVar1.Field1}");//正确
Console.WriteLine($"{myVar1.Field2}");//正确
Console.WriteLine($"{myVar2.Field1}");//正确
Console.WriteLine($"{myVar2.Field2}");//编译错误
}
**对于myVar1,引用的对象是B类型。
**对于myVar2,实际指向B类型对象,但看不到B扩展A的部分。
隐式引用转换:
(1)所有引用类型可以被隐式转换为object类型。
(2)任何接口可以隐式地转换为它继承的接口。
(3)类可以隐式地转换为:
**它继承链中的任何类
**它实现的任何接口
显示引用转换:
(1)从object到任何引用类型的转换。
(2)从基类到派生自它的类的转换。
**有效的显示转换有三种情况:
(1)显示转换是没必要的,也就是从派生类到基类的转换。
class A { public int Field1; }
class B:A { public int Field2; }
B myVar1 = new B();
A myVar2 = (A)myVar1;//不必转换,因为从A是B的基类
(2)源引用是null。
class A { public int Field1; }
class B:A { public int Field2; }
A myVar1 = null;
B myVar2 = (B)myVar1;//允许转换,因为myVar1为null
(3)由源引用指向的实际数据可以安全地进行隐式转换。
class A { public int Field1; }
class B:A { public int Field2; }
B myVar1 = new B();
A myVar2 = myVar1;//对应第一种情况,将myVar1隐式地转换为A类型,实际数据为B
B myVar3 = (B)myVar2;//允许转换,因为数据是B类型