举一个小例子
--------------类定义-------------
public class MyCurrency
{
public uint Dollars;
public ushort Cents;
public MyCurrency(uint dollars, ushort cents)
{
this.Dollars = dollars;
this.Cents = cents;
}
public override string ToString()
{
return string.Format(
"${0}.{1}", Dollars, Cents
);
}
//提供MyCurrency到float的隐式转换
public static implicit operator float(MyCurrency value)
{
return value.Dollars + (value.Cents / 100.0f);
}
//把float转换为MyCurrency,不能保证转换肯定成功,因为float可以
//存储负值,而MyCurrency只能存储正数
//float存储的数量级比uint大的多,如果float包含一个比unit大的值,
//将会得到意想不到的结果,所以必须定义为显式转换
//float到MyCurrency的显示转换
public static explicit operator MyCurrency(float value)
{
//checked必须加在此处,加在调用函数外面是不会报错的,
//因为溢出的异常是在强制转换运算符的代码中发生的
//Convert.ToUInt16是为了防止丢失精度
//该段内容很重要,详细参考"C#高级编程(中文第七版) 218页说明"
checked
{
uint dollars = (uint)value;
ushort cents = Convert.ToUInt16((value - dollars) * 100);
return new MyCurrency(dollars, cents);
}
}
}
--------------测试代码-------------
private void btn_测试自定义类型强制转换_Click(object sender, EventArgs e)
{
MyCurrency tmp = new MyCurrency(10, 20);
//调用MyCurrency到float的隐式转换
float fTmp = tmp;
MessageBox.Show(fTmp.ToString());
float fTmp2 = 200.30f;
//调用float到MyCurrency的显示转换
MyCurrency tmp2 = (MyCurrency)fTmp2;
MessageBox.Show(tmp2.ToString());
}