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」。此時就會需要明確轉換
隱含數值轉換表-由下面可知什麼型別可以轉成什麼型別
從 |
到 |
---|---|
short 、int、long、float、double 或 decimal |
|
short 、ushort、int、uint、long、ulong、float、double 或 decimal |
|
int 、long、float、double 或 decimal |
|
int 、uint、long、ulong、float、double 或 decimal |
|
long 、float、double 或 decimal |
|
long 、ulong、float、double 或 decimal |
|
float 、double 或 decimal |
|
ushort 、int、 uint、 long、ulong、 float、 double 或 decimal |
|
double |
|
float 、 double 或 decimal |
-
從轉換中,則可能會遺失有效位數,但不是量值int, uint, long,或ulong到float與long或ulong到double。
-
char 型別沒有隱含轉換。
-
浮點型別和 decimal 型別之間沒有隱含轉換。
-
如果常數運算式的值是在目的型別的範圍之內,則 int 型別的常數運算式可以轉換成 sbyte、byte、short、ushort、uint 或 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 |
收件者 |
---|---|
byte 、ushort、uint、ulong 或 char |
|
Sbyte 或 char |
|
sbyte 、 byte、 ushort、 uint、 ulong 或 char |
|
sbyte 、 byte、 short 或 char |
|
sbyte byte 、 short、 ushort、 uint、 ulong、 或 char |
|
sbyte 、byte、 short、 ushort、 int 或 char |
|
sbyte 、 byte、 short、 ushort、 int、 uint、 ulong 或 char。 |
|
sbyte 、 byte、 short、 ushort、 int、 uint、 long 或 char。 |
|
sbyte 、byte 或 short |
|
sbyte 、 byte、 short、 ushort、 int、 uint、 long、 |
|
sbyte 、 byte、 short、 ushort, int、 uint、 long、 |
|
sbyte 、 byte、 short、 ushort、 int、 uint、 long |
參考來源:
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
留言列表