class Program { static void Main(string[] args) { //1、类型转换 { //隐式转换:不需要转型,因为new返回一个Employee对象,而Object是Employee的基类型 object o = new Employee(); //显示转换:需要转型,因为Employee派生自Object Employee employee = (Employee)o; } //2、类型安全 { //由于Manager是派生自Employee类型,运行正常 Manager m = new Manager(); PromoteEmployee(m); //由于DateTime不是派生自Employee类型,运行时会抛出异常 //DateTime newYears = new DateTime(2019, 8, 25); //PromoteEmployee(newYears); } //3、类型检查 is ,用is判断类型相比比较低 /* * 这是由于is操作符首先核实o是否兼容于Employee类型,再次核实o是否引用了一个Employee * * is类型检查,永远不会抛出异常,结果只会返回 true 或 false * * **/ { object o = new object(); if ((o is object)) { } if ((o is Employee)) { } } //4、类型转换 as ,用as判断类型可提升其性能 /* * as 类型转换,如果类型转换成功,则返回对象,否则返回null,此转换方式也永远不会抛出异常 * * **/ { object o = new object(); Employee e = o as Employee; if (e != null) { } } //5、类型转行 as ,测试 { object o = new object(); Employee e = o as Employee; } //6、类型转换小测试 { //编译错误,由于是显示转换,不一定成功 //B b1 = new object(); //D d1 = new object(); //运行错误,由于是显示转换,不一定成功 B b1 = new B(); D d1 = (D)b1; //运行错误,由于是显示转换,不一定成功 object o = new object(); B b2 = (B)o; } Console.ReadKey(); } //应该将Object参数类型改为Employee类型,这样在编译时就能报错 static void PromoteEmployee(object o) { Employee e = (Employee)o; } } class D : B { } class B { } public class Manager : Employee { } public class Employee { }