類型轉換有兩種,隱式轉換和顯示轉換,當沒有數據丟失的時候,隱式轉換會自動進行。C#允許用戶定義自己的數據類型(結構和類),那么在他們之間的類型轉換需要用戶自己定義。
C#中基本類型轉換:點擊打開鏈接
1、類型轉換定義:public static implicit / explicit operator type1(type2 para){ return }
注意:
(1)、與運算符重載類似,使用 public 和 static ,表示與類相關的公有操作,使用 operator 關鍵字;
(2)、implicit 表示隱式轉換,explicit 表示顯示轉換,遵循的原則與預定義的類型轉換一致,當沒有數據丟失的時候使用 implicit ,否則使用 explicit ;
(3)、type1 表示 目標類型,type2 表示 源類型,需要用 return 返回 type1 類型對象。
下面給出自定義類與值類型的轉換定義:
// 自定義的一個類 public class MyClass1 { // uint 類型字段 a public uint a; // int 類型字段 b public int b; // 自定義構造函數 public MyClass1(uint a,int b) { this.a = a; this.b = b; } // 自定義的顯示轉換:將 MyClass1 類型的對象轉換成 int 類型 public static explicit operator int(MyClass1 obj) { // 實際上是將 字段 a 的值通過基本類型的強制轉換,變成 int 類型的返回值 return (int)obj.a; } // 自定義的隱式轉換: 將 MyClass1 類型的對象轉換成 float 類型 public static implicit operator float(MyClass1 obj) { // 實際上是將 字段 b 的值轉換成float,因為 int 轉 float 是隱式的,所以定義的時候可以定義為 implicit return obj.b; } }
下面給出調用示例:
// 聲明並初始化 MyClass1 類的對象 MyClass1 myClass = new MyClass1(1,11); // 調用自定義的顯示轉換 int a = (int)myClass; // a = 1 // 調用自定義的隱式轉換 float b = myClass; // b = 11
2、類之間自定義類型轉換
當兩個類之間沒有派生關系時(有派生關系時,轉換已經存在),可以在源類型或者是派生類型中定義類型轉換。
注意:
(1)、兩個類之間沒有派生關系時才可以自定義類型轉換;
(2)、類型轉換在源類型或目標類型中定義,可以分開定義,但是兩個類中不能定義相同的類型轉換。
下面給出示例:
// 自定義的類 MyClassA public class MyClassA { public int id { get; set; } public string name { get; set; } // 定義的顯示類型轉換,返回一個 MyClassB 類型的對象 // 如果 MyClassB 中沒有這個與這個相同的轉換,這里可以給出 public static explicit operator MyClassB(MyClassA obj) { return new MyClassB() { id = obj.id, text = obj.name }; } } // 自定義的類 MyClassB public class MyClassB { public int id { get; set; } public string text { get; set; } // 定義的顯示類型轉換,返回一個 MyClassA 類型的對象 public static explicit operator MyClassA(MyClassB obj) { return new MyClassA(); } // 定義的顯示類型轉換,返回一個 MyClassB 類型的對象 //public static explicit operator MyClassB(MyClassA obj) //{ // return new MyClassB() { id = obj.id, text = obj.name }; //} } 下面是調用示例: static void Main(string[] args) { // 聲明並初始化一個 MyClassA 類對象 MyClassA ca = new MyClassA { id = 11, name = "jack" }; MyClassB cb = (MyClassB)ca; // 聲明並初始化一個 MyClassB 類對象 MyClassB myClassB = new MyClassB(); // 使用 強制類型轉換 MyClassA myClassA = (MyClassA)myClassB; MyClassB myClassB1 = (MyClassB)myClassA; }
3、基類和派生類之間的類型轉換
注意:派生類可以隱式轉換成基類。基類轉換成派生類時,只有基類引用指向該派生類對象時可以轉換成功,其他的會拋出異常。
下面給出示例:
// 基類 public class MyBase { } public class MySub1 : MyBase { } public class MySub2 : MyBase { } 下面是調用示例: static void Main(string[] args) { // 基類的引用指向基類的對象 MyBase myBase = new MyBase(); // MySub1 類型的對象隱式轉換成了 MyBase 類型,成功 MyBase myBase1 = new MySub1(); // MySub2 類型的對象隱式轉換成了 MyBase 類型,成功 MyBase myBase2 = new MySub2(); // 可以執行,成功 MySub1 mySubA1 = (MySub1)myBase1; // 因為 MyBase 引用的是本類的對象,執行的時候會拋出異常,失敗 MySub1 mySubA = (MySub1)myBase; // 因為 MyBase 引用的是 MySub2 類型的對象,執行的時候會拋出異常,失敗 MySub1 mySubA2 = (MySub1)myBase2; }
出處:https://blog.csdn.net/cloproad/article/details/79101275