到目前为止,在需要把一种类型转换为另一种类型时,使用的都是类型转换。比如显式转换和隐式转换。
在计算过程中,int 可以隐式转换为long 或double,采用相同的方式还可以定义所创建的类(隐式或显式)转换为其他类的方式。
一.重载转换运算符
除了重载如上所述的数学运算符之外,还可以定义类型之间的隐式和显式转换。
ConvClass1 op1 = new ConvClass1();
ConvClass2 op2 = op1; ///隐式转换
ConvClass2 op2 = (ConvClass2)op1; ///显式转换
二.as运算符
<operand> as <type>
这个运算符只适用于下列情况:
<operand>的类型是<type>类型
<operand>可以隐式转换为<type>类型
<operand>可以封箱到<type>类型中
注意: 如果不能从<operand>转换为<type>,则表达式的结果就是null。
class ClassA : IMyInterface
{
}
class ClassD : ClassA ///ClassD类型的变量包含ClassA 类型的实例,D可以转换成A
{
}
ClassA obj1 = new ClassA();ClassD obj2 = obj1 as ClassD; //把obj1 中存储的ClassA 转换为ClassD 类型
因为ClassA不能转换为ClassD,所以转换失败,也就是obj2的结果是null。
ClassD obj1 = new ClassD();
ClassA obj2 = obj1;
ClassD obj3 = obj2 as ClassD;
这次obj3 最后包含与obj1 相同的对象引用,而不是null。
(1)简单的类型转换代码会抛出异常
ClassA obj1 = new ClassA();
ClassD obj2 = (ClassD)obj1;
而用as运算符则会把null 值赋予obj2,而不是异常导致程序出错。
(2)实例:Animal 和派生于Animal 的一个类Cow中,
public void MilkCow(Animal myAnimal)
{
Cow myCow = myAnimal as Cow ;
if (myCow != null) ///如果对象不为空,
{
myCow.Milk() ;
}
else
{
Console.WriteLine ("{0} isn’t a cow, and so can’t be milked.", myAnimal.Name) ;
}
}
这要比检查异常要简单得多!