1.重载转换运算符
到目前为止,我们使用的类型转换,包括隐式类型转换和显示类型转换都是在两个相关的类中进行的,这几个类要么是简单类型之间的转换,比如int 隐式转换成double,要么是有继承关系,或者是实现了接口。假如我们要在两个不相关的类之间进行转换,可以重载转换运算符。
class ConvClass1 { public int Val; /// <summary> /// 定义ConvClass2隐式转换为ConvClass2的方式 /// </summary> /// <param name="c1"></param> /// <returns></returns> public static implicit operator ConvClass2(ConvClass1 c1) { ConvClass2 c = new ConvClass2(); c.Val = c1.Val; return c; } } class ConvClass2 { public double Val; /// <summary> /// 定义ConvClass2显示式转换为ConvClass1的方式 /// </summary> /// <param name="c1"></param> /// <returns></returns> public static explicit operator ConvClass1(ConvClass2 c1) { ConvClass1 c = new ConvClass1(); checked { c.Val = (int)c1.Val; } return c; } } class Program { static void Main(string[] args) { ConvClass1 c1 = new ConvClass1(); c1.Val = 5; ConvClass2 c2 = c1;//ConvClass1隐式转换为ConvClass2 ConvClass2 d = new ConvClass2(); d.Val = 8.88; ConvClass1 d1 = (ConvClass1)d;//ConvClass2显示转换为ConvClass1,如果val的值超过了int的范围会引发一个报错 Console.ReadLine(); } }
2.as运算符
as运算符把一种类型转换为指定的引用类型,如果不能转换返回null,as 运算符只使用以下几种情况:
<operand> as <type>
1)<operand>的类型是<type>;
2) <operand>可以隐式转换为<type>;
3)<operand>可以封箱为<type>。
class Program { static void Main(string[] args) { D d = new D(); A a = d; D dd = a as D;//a 是D类型,可以转换 MyInterface i = a as MyInterface;// a 可以隐式转换成MyInterface int j = 1; object o = j as object;//j可以封箱为object Console.ReadLine(); } } interface MyInterface { } class A : MyInterface { } class D : A { }
as运算符非常有用,因为一般的类型转换如果转换不了会抛出异常,需要处理异常,as 运算符如果转换不了返回null,只需要判断是不是null就可以了,少了处理异常的代码。