explicit 和implicit 屬於轉換運算符,如用這兩者可以讓我們自訂的類型支援相互交換
explicti 表示明確轉換,如從A -> B 必須進行強制類型轉換(B = (B)A )
implicit 表示隱式轉換,如從B -> A 只需直接賦值(A = B)
隱式轉換可以讓我們的程式碼看起來更漂亮、更簡潔易懂,所以最好多使用implicit 運算子。不過!如果物件本身在轉換時會損失一些資訊(如精確度),那麼我們只能使用explicit 運算符,以便在編譯期就能警告客戶呼叫
namespace OperatorTest { /// <summary> /// 猪 /// </summary> public class Pig { public Pig(string name) { this.Name = name; } public string Name; //explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符。 //static explicit operator target_type { source_type identifier } //target_type 目标类型 //source_type 源类型 //identifier Something /*转换运算符将源类型转换为目标类型。源类型提供转换运算符。与隐式转换不同,必须通过强制转换的方式来调用显式转换运算符。如果转换操作可能导致异常或丢失信息,则应将其标记为 explicit。这可以防止编译器无提示地调用可能产生无法预见后果的转换操作*/ public static implicit operator Pig(Monkey value) { Pig mk = new Pig(value.Name + ":猴子变猪!!"); return mk; } }
namespace OperatorTest { /// <summary> /// 猴子 /// </summary> public class Monkey { public Monkey(string name) { this.Name = name; } public string Name; //implicit 关键字用于声明隐式的用户定义类型转换运算符。 //static implicit operator target_type { source_type identifier } public static explicit operator Monkey(Pig value) { Monkey mk = new Monkey(value.Name + ":猪变猴子!!"); return mk; } }
Monkey monkey = new Monkey("悟空"); //隐式转换 猴子变猪 Pig monkeyToPig = monkey; MessageBox.Show(monkeyToPig.Name); Pig pig = new Pig("八戒"); //显式转换 猪变猴子 Monkey pigToMonkey = (Monkey)pig; MessageBox.Show(pigToMonkey.Name);
輸出:
應用:
當然也可以在物件A的類別中定義一個函數來實現這個處理,不過這樣有可能會多出一步,那就是當該函數不是靜態函數時,需要先實例化該物件來呼叫對應的處理函數。
explicit 關鍵字
demo下載