C# 重载转换运算符
除了重载上述数学运算符外,还可以定义类型之间的隐式和显式转换。如果要在不相关的类型之间转换,例如类型之间没有继承关系,也没有共享接口,就必须这么做。
下面定义ConvClassl和ConvClass2之间的隐式转换,即编写下列代码:
ConvClassl opl = new ConvClassl ();
ConvClass2 op2 = opl;
另外,可以定义一个显式转换:
ConvClassl opl = new ConvClassl ();
ConvClass2 op2 = (ConvClass2)opl;
例如,考虑下面的代码:
public class ConvClassl
{
public int val;
public static implicit operator ConvClass2(ConvClassl opl)
{
ConvClass2 returnVal = new ConvClass2 ();
returnVal.val = opl.val;
return returnVal;
public class ConvClass2
{
public double val;
public static explicit operator ConvClassl(ConvClass2 opl)
{
ConvClassl returnVal = new ConvClassl();
checked {returnVal.val = (int)opl.val;};
return returnVal;
}
}
其中,ConvClassl包含一个int值,ConvClass2包含一个double值。int值可以隐式转换为double值,所以可在 ConvClassl和ConvClass2之间定义一个隐式转换。但反过来就不可行,应把ConvClass2和ConvClassl之间的转换定义为显式转换。
在代码中,用关键字implicit和explicit来指定这些转换,如上所示。对于这些类,下面的代码就很好:
ConvClassl opl = new ConvClassl();
opl.val = 3;
ConvClass2 op2 = opl;
但反向转换需要进行下述显式数据类型转换:
ConvClass2 opl = new ConvClass2();
opl.val = 3el5;
ConvClassl op2 = (ConvClassl)opl;
如果在显式转换中使用了checked关键字,则上述代码将产生一个异常,因为opl的val属性值太大,不能放在op2的val属性中。
点击加载更多评论>>