C# 重載轉(zhuǎn)換運(yùn)算符
除了重載上述數(shù)學(xué)運(yùn)算符外,還可以定義類型之間的隱式和顯式轉(zhuǎn)換。如果要在不相關(guān)的類型之間轉(zhuǎn)換,例如類型之間沒有繼承關(guān)系,也沒有共享接口,就必須這么做。
下面定義ConvClassl和ConvClass2之間的隱式轉(zhuǎn)換,即編寫下列代碼:
ConvClassl opl = new ConvClassl ();
ConvClass2 op2 = opl;
另外,可以定義一個(gè)顯式轉(zhuǎn)換:
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包含一個(gè)int值,ConvClass2包含一個(gè)double值。int值可以隱式轉(zhuǎn)換為double值,所以可在 ConvClassl和ConvClass2之間定義一個(gè)隱式轉(zhuǎn)換。但反過來就不可行,應(yīng)把ConvClass2和ConvClassl之間的轉(zhuǎn)換定義為顯式轉(zhuǎn)換。
在代碼中,用關(guān)鍵字implicit和explicit來指定這些轉(zhuǎn)換,如上所示。對(duì)于這些類,下面的代碼就很好:
ConvClassl opl = new ConvClassl();
opl.val = 3;
ConvClass2 op2 = opl;
但反向轉(zhuǎn)換需要進(jìn)行下述顯式數(shù)據(jù)類型轉(zhuǎn)換:
ConvClass2 opl = new ConvClass2();
opl.val = 3el5;
ConvClassl op2 = (ConvClassl)opl;
如果在顯式轉(zhuǎn)換中使用了checked關(guān)鍵字,則上述代碼將產(chǎn)生一個(gè)異常,因?yàn)閛pl的val屬性值太大,不能放在op2的val屬性中。
點(diǎn)擊加載更多評(píng)論>>