由低层次类型转换为高层次类型称为向上类型转换。向上类型转换是自动进行的,比如把int型变量赋给为long型变量,把long型变量赋给double型变量,转换都是自动进行的。由派生类转换为基类也是向上提升,也是自动进行的,但转换后,基类的引用符不能应用派生类对象特有的函数。
Human jean = new Human();
Vervebrata someone = jean;
some.Work();
运行上面语句会出错,虽然someone指向了一个Human类的对象,但是它不能调用Work()函数,因为someone的类型为Vertebrata,而基类Vertebrata中没有申明Work()函数。要想通过基类引用符someone调用派生类特有的函数,必须将someone的类型强制转换为派生类。这种由基类向派生类转换的过程称为向下类型转换。
//在某处,基类引用符指向了派生类对象
Human jean = new Human();
Vertebrata someone = jean;
//在程序的另一个地方
if (someone is Human)
{
Human people = (Human)someone; //强制转换
people.Work();
}
只有由基类向派生类转换时才能强制向下转换,否则程序会抛出异常,所以转换之前我们用is运算符进行检查。
上面的转换也以通过as运算符实现。
Human jean = new Human();
Vertebrata someone = jean;
Human people = someone as Human //as运算符
if (people != null)
{
people.Work();
}
as运算符用于执行两个引用类型之间的显示转换,它是一种安全的转换,使用前不需要用is运算符测试类型。在类型不兼容的时候,转换的结果是null,而不会抛出异常。