[C#]轉換運算子

  • 587
  • 0
  • 2016-06-10

有時候自訂的類別需要互相轉換使用時,轉換運算子就很好用。

C#的轉換運算子有分為「隱含轉換運算子」和「明確轉換運算子」兩種。

隱含轉換
轉換不會造成資料遺失或例外,不需要指定型別就可以轉換,
例如:整數100要轉成double 型別,則只要這樣寫 double i = 100;

隱含轉換運算子寫法與運用如下:
撰寫重點:
1.必須使用public static implicit operator關鍵字組,來撰寫轉換函式。
2.轉換函式必須寫在「類別裡」,
否則會出現「使用者定義的轉換必須轉換為封入類型或從封入類型轉換」的錯誤訊息。

public  class PersonNo
{
   public int No { get; set; }
			
   /// <summary>
   /// 隱含轉換運算子1,將int隱含轉換成PersonNo
   /// </summary>
   public static implicit operator PersonNo(int no)
   {
      return new PersonNo { No = no };
   }

   /// <summary>
   /// 隱含轉換運算子2,將PersonNo隱含轉換成int
   /// </summary>
   public static implicit operator int(PersonNo pn)
   {
      return pn.No;
   }

}

static void Main(string[] args)
{
   //隱含轉換運算子1的使用方式
   //可以直接將int型別的資料指定給PersonNo型別,
   //實現將int隱含轉換成PersonNo,如下
   PersonNo pn = 1789;


   //隱含轉換運算子2的使用方式
   //可以直接將PersonNo型別的物件指定給int型別,
   //實現將PersonNo隱含轉換成int,如下
   int number = pn;
}

 

明確轉換
轉換作業可能造成例外狀況或遺失資訊的情況,所以需要明確指定轉換的型別,
例如:小數99.9要轉成int型別,則要這樣寫: int i = (int)99.9;

明確轉換運算子的寫法與運用如下:
撰寫重點:
1.必須使用public static explicit operator關鍵字組,來撰寫轉換函式。
2.轉換函式一樣必須寫在「類別裡」,
否則會出現「使用者定義的轉換必須轉換為封入類型或從封入類型轉換」的錯誤訊息。

public  class Person
{
   public int No { get; set; }

   public string Name { get; set; }

   /// <summary>
   /// 明確轉換運算子1,將string明確轉換成Person
   /// </summary>
   public static explicit operator Person(string name)
   {
      return new Person { Name = name};
   }

   /// <summary>
   /// 明確轉換運算子2,將Person明確轉換成string
   /// </summary>
   public static explicit operator string(Person person)
   {
      return person.Name;
   }
			
}


static void Main(string[] args)
{
   //明確轉換運算子1的使用方式
   //將string型別的名字,明確標示轉換型別,轉換成Person
   Person p = (Person)"鍋苔鳴";

   //明確轉換運算子2的使用方式
   //將Person物件,明確標示轉換型別,轉換成string
   string name = (string)p;
}