msdn參考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx
http://msdn.microsoft.com/zh-cn/library/z5z9kes2.aspx
http://msdn.microsoft.com/zh-cn/library/xhbhezf4.aspx
operator 關鍵字來重載內置運算符,或提供類或結構聲明中的用戶定義轉換。它可以定義不同類型之間采用何種轉化方式和轉化的結果。
operator用於定義類型轉化時可采用2種方式,隱式轉換(implicit)和顯示轉換(explicit)
一般定義方式為
public static implicit 目標類型(被轉化類型 變量參數) { return 目標類型結果; } public static explicit 目標類型(被轉化類型 變量參數) { return 目標類型結果; }
代碼案例
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 自定義裝換 { class Program { static void Main(string[] args) { myclass mc = 1;//通過隱式裝換,生成myclass對象 Console.WriteLine(mc.Value); myclass mc2 = new myclass(2); Console.WriteLine((int)mc2);//顯示轉化,調用myclass至int的處理方法 Console.WriteLine(mc2);//隱式轉化,調用myclass至string的處理方法 } } class myclass { private int value;//聲明value私有字段 public int Value//聲明只讀屬性 { get { return value; } } public myclass(int value)//構造函數 { this.value = value; } public static explicit operator int(myclass mc)//顯示聲明的myclass轉int類處理方法 { return mc.value; } public static implicit operator myclass(int value)//隱式聲明的int轉myclass類處理方法 { return new myclass(value); } public static implicit operator string(myclass mc)//隱式聲明的myclass轉string類處理方法 { return ("定義的myclass類string類型轉化結果"); } } }
結果
【注意】:1.轉換運算符將源類型轉換為目標類型。 源類型提供轉換運算符。 與隱式轉換不同,必須通過強制轉換的方式來調用顯式轉換運算符。 如果轉換操作可能導致異常或丟失信息,則應將其標記為 explicit。這可以防止編譯器無提示地調用可能產生無法預見后果的轉換操作。
2.在利用implicit的隱式聲明時,注意在不明語言的情況下,存在多個由當前類轉化為其他類型數據的隱式聲明的時候,可能會出現編譯錯誤,是由於隱式聲明下,2者都可以調用,編譯器不知道選擇哪個而出現的錯誤。
例如
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 自定義裝換 { class Program { static void Main(string[] args) { myclass mc2 = new myclass(2); Console.WriteLine(mc2);//出錯位置,編譯器無法選擇有效的類型轉化方式 } } class myclass { private int value; public int Value { get { return value; } } public myclass(int value) { this.value = value; } public static implicit operator myclass(int value) { return new myclass(value); } ///2個隱式聲明myclass類轉化類型的方法 public static implicit operator int(myclass mc) { return mc.value; } public static implicit operator string(myclass mc) { return ("定義的myclass類string類型轉化結果"); } }
解決方法:
1.將console.writeline()中輸出進行強制轉換,明確轉化目標,例如
Console.WriteLine((string)mc2);
2.將2個隱式轉化方法之一改為顯示,編譯器將默認調用隱式那個
public static explicit operator int(myclass mc)//改為顯示轉化 { return mc.value; } public static implicit operator string(myclass mc) { return ("定義的myclass類string類型轉化結果"); }