operator 關(guān)鍵字用于在類或結(jié)構(gòu)聲明中聲明運算符。運算符聲明可以采用下列四種形式之一:
public static result-type operator unary-operator ( op-type operand )
public static result-type operator binary-operator ( op-type operand, op-type2 operand2 )
public static implicit operator conv-type-out ( conv-type-in operand )
public static explicit operator conv-type-out ( conv-type-in operand )
參數(shù):
注意:
explicit 關(guān)鍵字用于聲明必須使用強制轉(zhuǎn)換來調(diào)用的用戶定義的類型轉(zhuǎn)換運算符。
static explicit operator target_type { source_type identifier }
參數(shù):
注意:
implicit 關(guān)鍵字用于聲明隱式的用戶定義類型轉(zhuǎn)換運算符。
static implicit operator target_type { source_type identifier }
注意:
示例:
以下是一個綜合示例,簡要展示用法。如要更具體細節(jié)的了解,請參閱MSDN Library。
// keywords_operator.cs// keywords_operator.csusing System;namespace Hunts.Keywords{// 定義一個人民幣結(jié)構(gòu)。數(shù)據(jù)類型轉(zhuǎn)換的語法對于結(jié)構(gòu)和類是一樣的public struct RMB{// 注意:這些數(shù)的范圍可能不能滿足實際中的使用public uint Yuan;public uint Jiao;public uint Fen;public RMB(uint yuan, uint jiao, uint fen){if (fen > 9){jiao += fen / 10;fen = fen % 10;}if (jiao > 9){yuan += jiao / 10;jiao = jiao % 10;}this.Yuan = yuan;this.Jiao = jiao;this.Fen = fen;}public override string ToString(){return string.Format("¥{0}元{1}角{2}分", Yuan, Jiao, Fen);}// 一些操作public static RMB operator +(RMB rmb1, RMB rmb2){return new RMB(rmb1.Yuan + rmb2.Yuan, rmb1.Jiao + rmb2.Jiao, rmb1.Fen + rmb2.Fen);}public static implicit operator float(RMB rmb){return rmb.Yuan + (rmb.Jiao/10.0f) + (rmb.Fen/100.00f);}public static explicit operator RMB(float f){uint yuan = (uint)f;uint jiao = (uint)((f - yuan) * 10);uint fen = (uint)(((f - yuan) * 100) % 10);return new RMB(yuan, jiao, fen);}// more}class App{static void Main(){RMB r1, r2, r3, r4;// 記得小學(xué)時的某次捐款,我把口袋里藏好的一塊錢加6張一毛錢以及13個一分錢的硬幣都貢獻出去了:(r1 = new RMB(1, 6, 13);// 其實當(dāng)時其他人都已經(jīng)交過了,他們總共交了:r2 = new RMB(46, 9, 3);// 那么加上我的就是:r3 = r1 + r2;Console.WriteLine("r3 = {0}", r3.ToString());// 隱式轉(zhuǎn)換float f = r3;Console.WriteLine("float f= {0}", f);// 顯式轉(zhuǎn)換r4 = (RMB)f;Console.WriteLine("r4 = {0}", r4.ToString());//如果不進行顯示轉(zhuǎn)換,將出現(xiàn)錯誤 CS0266: 無法將類型“float”隱式轉(zhuǎn)換為“Hunts.Keywords.RMB”。存在一個顯式轉(zhuǎn)換(是否缺少強制轉(zhuǎn)換?)Console.Read();}}}
/*
控制臺輸出:
r3 = ¥48元6角6分
float f = 48.66
r4 = ¥48元6角5分
*/我們會發(fā)現(xiàn)r4結(jié)果少了一分錢!這是因為在:
uint fen = (uint)(((f - yuan) * 100) % 10);這句中,在將float轉(zhuǎn)換為uint時發(fā)生了圓整錯誤(這與計算機以二進制存儲有關(guān))。解決這個錯誤,我們可以使用System.Convert類中用于處理數(shù)字的靜態(tài)方法:
uint fen = Convert.ToUInt32(((f - yuan) * 100) % 10);不過使用System.Convert處理會有些性能的損失。