1.隱含轉換(implicit conversions):

基本上是默認許可的,C# compiler無須詳細檢查就能安全轉換型別。

如int轉float過程中資料不會遺失一般也不會失敗

因為在不管什麼型別,都以bit儲存(0和1),

只要目標型別有足夠的空間大部分結果都是正確的

(但也有可能與期望的不同,如精準度變低)。

小轉大,例如:int轉double。
int score = 95;
double d = 0;
d = score; //進行隱含轉換,資料不會因此失真


但如果反過來的話,就會出現錯誤
double score = 99.9;
int i = 0;
i = score;這時候就會出現錯誤訊息「型別double不能隱含轉換為int」。此時就會需要明確轉換

隱含數值轉換表-由下面可知什麼型別可以轉成什麼型別

sbyte

short intlongfloatdouble 或 decimal

byte

short ushortintuintlongulongfloatdouble 或 decimal

short

int longfloatdouble 或 decimal

ushort

int uintlongulongfloatdouble 或 decimal

int

long floatdouble 或 decimal

uint

long ulongfloatdouble 或 decimal

long

float double 或 decimal

char

ushort int uint longulong float double 或 decimal

float

double

ulong

float  double 或 decimal

 

 

  • 從轉換中,則可能會遺失有效位數,但不是量值int, uint, long,或ulongfloatlongulongdouble

  • char 型別沒有隱含轉換。

  • 浮點型別和 decimal 型別之間沒有隱含轉換。

  • 如果常數運算式的值是在目的型別的範圍之內,則 int 型別的常數運算式可以轉換成 sbytebyteshortushortuint 或 ulong

2.參考型別的隱含轉換:

參考型別 (類別、委派、陣列或介面=Reference Type),

將(子)類別轉換為其任何直接或間接基底類別(父類別)或介面時,一律會使用隱含轉換。

不必使用特殊語法,因為衍生類別(子類別)一定包含基底類別(父類別)的所有成員。

註:父類別不能直接隱含轉換成子類別,編譯會有錯誤

如果需要從基底型別(父類別)轉換成衍生型別(子類別),就必須進行明確轉換

例如有二個Class 

//父類別    
class BkClass {}

//子類別
class CarClass : BkClass {}

以下這樣是正確可編譯通過的

static void Main(string[] args)
        {
            //new出父類別(貓)
            BkClass[] bkclassar = new BkClass[4];

            //new出子類別(小叮噹)
            CarClass[] carclassar = new CarClass[4];

            //子類別可以隱含轉換成父類別(小叮噹一定是貓的一種)
            bkclassar = carclassar;

            //反之則不行(貓不一定是小叮噹)
            //carclassar = bkclassar;          
        }

3.明確轉換(Explicit conversions)

如果轉換可能會造成資料遺失,編譯器會要求執行明確轉換,這稱為「轉型」(Cast)。

明確告知編譯器打算進行轉換而且知道可能會造成資料遺失的一種方式。

大轉小,例如:double轉int。此時就會需要用以下兩個方法來轉。

1.(Cast) 

double score = 99.9;
int i1 = 0,i2=0;

i1 = (int)score; //效能較佳
i2 = System.Convert.ToInt32(score);

以Convert.ToInt32和(int)來看

//Cast:無條件捨去(效能較佳)
//Convert:四捨五入
//float型別與decimal型別之間沒有「隱含轉換」 

 

2.Convert.ToType 萬用的型別轉換指令

注意:一般說明確型別轉換是指以Cast的方式,若在隱含數值轉換表中查不到,

可以使用Convert.ToType來轉,例如用(string)想把數字轉字串,就不能轉

會出現「無法將型別int轉換為string」,用Convert.ToString(數字)即可

 

Convert可用的轉換表參考此處

http://msdn.microsoft.com/zh-tw/library/08h86h00(v=vs.90).aspx

 

4.參考型別的明確轉換

針對參考型別,如果需要從基底型別(父類別)轉換成衍生型別(子類別),就必須進行明確轉換:

假設有二個class 

//父類別 
class BkClass {}

//子類別
class CarClass : BkClass {}

父類別要轉成子類別

 static void Main(string[] args)
        {
            //new出父類別
            BkClass[] bkclassar = new BkClass[4];

            //new出子類別
            CarClass[] carclassar = new CarClass[4];

            //子類別可以隱含轉換成父類別
            //bkclassar = carclassar;

            //父類別要先明確轉型成子類別,才能轉換
            carclassar =(CarClass[])bkclassar;          
        }

5.有時候在Run Time執行階段才會發現轉型失敗

對於有些參考型別轉換,編譯器無法判斷轉型是否有效。

因此轉型作業編譯正確,但卻可能會在執行階段失敗。

型別轉換 (Type Cast) 在執行階段失敗將導致擲回 InvalidCastException。

明確數值轉換表

From

收件者

sbyte

byte ushortuintulong 或 char

byte

Sbyte 或 char

short

sbyte  byte ushort uint ulong 或 char

ushort

sbyte  byte short 或 char

int

sbyte byte  short ushort uint ulong、 或 char

uint

sbyte byte short ushort int 或 char

long

sbyte  byte short ushort int uint ulong 或 char

ulong

sbyte  byte short ushort int uint long 或 char

char

sbyte byte 或 short

float

sbyte  byte short ushort int uint long

 ulong char、 或 decimal

double

sbyte  byte short ushort, int uint long

 ulong char float、 或 decimal

decimal

sbyte  byte short ushort int uint long

 ulong char float 或 double

 

參考來源:

http://msdn.microsoft.com/zh-tw/library/ms173105.aspx

http://www.dotblogs.com.tw/ricochen/archive/2009/11/11/11520.aspx

http://javapig.pixnet.net/blog/post/48216514-c%23--%E9%9A%B1%E5%90%AB%E8%BD%89%E6%8F%9B-%26-%E6%98%8E%E7%A2%BA%E8%BD%89%E6%8F%9B

http://unicorntudo.blogspot.tw/2013/12/convertint32.html

http://books.google.com.tw/books?id=nvWzBAAAQBAJ&pg=SA3-PA27&lpg=SA3-PA27&dq=c%23+%E7%84%A1%E6%B3%95%E5%B0%87%E5%9E%8B%E5%88%A5int%E8%BD%89%E6%8F%9B%E7%82%BAstring&source=bl&ots=ALQUfwCFKW&sig=dcNJ_KRSfNWuKmv7L1E3Gr7Nb30&hl=zh-TW&sa=X&ei=Q1t8VLCUM4zv8gWplYCAAw&ved=0CBsQ6AEwADgU#v=onepage&q=c%23%20%E7%84%A1%E6%B3%95%E5%B0%87%E5%9E%8B%E5%88%A5int%E8%BD%89%E6%8F%9B%E7%82%BAstring&f=false

隱含數值轉換表

http://msdn.microsoft.com/zh-tw/library/y5b434w4.aspx

明確數值轉換表

http://msdn.microsoft.com/zh-tw/library/yht2cx7b.aspx

 

 

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小豆干 的頭像
    小豆干

    小豆干就是我唷

    小豆干 發表在 痞客邦 留言(0) 人氣()