位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 重载转换运算符

提问人:刘团圆发布时间:2020-12-07

    除了重载上述数学运算符外,还可以定义类型之间的隐式和显式转换。如果要在不相关的类型之间转换,例如类型之间没有继承关系,也没有共享接口,就必须这么做。

下面定义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属性中。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部