類型轉換
顯示轉換
隱式轉換
使用者自訂轉換
(1) 隱式轉換:一般是低類型向高類型轉化,能夠保證值不發生變化。
隱式數值轉換:
從 sbyte 到 short、int、long、float、double 或 decimal。
從 byte 到 short、ushort、int、uint、long、ulong、float double 或 decimal。
從 short 到 int、long、float、double 或 decimal。
從 ushort 到 int、uint、long、ulong、float、double 或 decimal。
從 int 到 long、float、double 或 decimal。
從 uint 到 long、ulong、float、double 或 decimal。
從 long 到 float、double 或 decimal。
從 ulong 到 float、double 或 decimal。
從 char 到 ushort、int、uint、long、ulong、float、double 或 decimal。
從 float 到 double。
不存在向 char 類型的隱式轉換,因此其它整型的值不會自動轉換為 char 類型。
浮點型不能隱式地轉化為decimal型
隱式枚舉轉換
隱式枚舉轉換允許將十進位整數 0 轉換為任何枚舉類型。
隱式引用轉換
衍生類別向基類轉換
隱式引用轉換是指一類參考型別之間的轉換,這種轉換總是可以成功,因此不需要在運行時進行任何檢查。
裝箱轉換
裝箱轉換允許將實值型別隱式轉換為參考型別。
(2) 顯示轉換:也稱強制類型轉換。不能保證資料的正確性。
(type)(運算式)
(3) 使用者自訂轉換
所有的使用者自訂轉換都是靜態,要使用static關鍵字
使用者自訂轉換分顯示和隱示,它們用implicit(隱式轉換)或 explicit(顯示轉換)關鍵字聲明。
static 訪問修辭符 轉換修辭符 operator 轉換類型(參數)
樣本:
using System;
struct Number
{
private int value;
public Number(int value)
{
this.value = value;
}
//使用者自訂整型到Number型的隱式轉換
static public implicit operator Number(int value)
{
return new Number(value);
}
// 使用者自訂從Number型到整型的顯示轉換
static public explicit operator int(Number n)
{
return n.value;
}
//使用者自訂從Number類型到string類型的隱式轉換
static public implicit operator string(Number n)
{
return n.ToString();
}
}
class Test
{
static public void Main()
{
Number n;
n= 10;
Console.WriteLine((int)n);
//隱式轉換到string
Console.WriteLine(n);
}
}
使用System.Convert類
將一個基礎資料型別 (Elementary Data Type)轉換為另一個基礎資料型別 (Elementary Data Type)。
使用Parse方法
大部份預定義實值型別都有這個靜態方法,用來將相應的文本轉化為相應的實值型別。
裝箱和unboxing
裝箱和unboxing使實值型別能夠與 object 類型相互轉換。
裝箱轉換允許將“實值型別”隱式轉換為“參考型別”。將“實值型別”的值裝箱的操作包括:分配一個對象執行個體並將“實值型別”的值複製到該執行個體中。
樣本:
此例將整數變數 i 通過裝箱轉換為對象 o。此例顯示對象保留了內容的原始副本,即 123。
using System;
class TestBoxing
{
public static void Main()
{
int i = 123;
object o = i; // 隱式的裝箱
i = 456; // 改變變數i的值
Console.WriteLine("The value-type value = {0}", i); //456
Console.WriteLine("The object-type value = {0}", o); //123 是i的複製值
}
}
unboxing轉換:unboxing轉換允許將參考型別顯式轉換為實值型別。
unboxing操作包括以下兩個步驟:首先檢查該對象執行個體是否是某個給定的實值型別的裝了箱的值,然後將值從執行個體中複製出來。
樣本:
下面的樣本闡釋無效unboxing的情況,即錯誤的unboxing如何導致 InvalidCastException。通過使用 try 和 catch,發生錯誤時會顯示錯誤資訊。
using System;
public class UnboxingTest
{
public static void Main()
{
int intI = 123;
object o = intI; //裝箱
try
{
int intJ = (short) o; //unboxing無效,short不是裝了箱的實值型別. 檢查該對象執行個體是否是某個給定的實值型別的裝了箱的值
Console.WriteLine("Unboxing OK.");
}
catch (InvalidCastException e)
{
Console.WriteLine("{0} Error: Incorrect unboxing.",e);
}
}
}
其它轉換用運算子
as
as 運算子用於執行參考型別的顯式類型轉換。 如果要轉換的類型與指定類型相容,轉換就會成功;如果類型不相容,則返回null。
運算式as 類型
as 運算子類似於類型轉換,所不同的是,當轉換失敗時,as 運算子將返回null,而不是引發異常。
樣本:
object o1=”SomeString”;
object o2=5;
string s1=o1 as string; //類型相容 s1=”SomeString”
string s2=o2 as string; //s2=null
is
is 運算子用於檢查對象的類型是否與給定類型相容(對象是該類型,或是派生於該類型)。
運算式 is 類型
樣本:
int i=10;
if ( i is object) //true
{}
sizeof
sizeof 運算子用於獲得實值型別的大小(以位元組為單位)。
sizeof(type)
sizeof 運算子僅適用於實值型別,而不適用於參考型別。
sizeof 運算子僅可用於 unsafe 模式。
樣本:
unsafe
{
Console.WriteLine(“{0}”,sizeof(int));
}