有時候自訂的類別需要互相轉換使用時,轉換運算子就很好用。
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;
}