C的隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換_第1頁
C的隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換_第2頁
C的隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換_第3頁
C的隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換_第4頁
C的隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

C#勺隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換C#勺隱式類型轉(zhuǎn)換在C崎言中,一些預定義的數(shù)據(jù)類型之間存在著預定義的轉(zhuǎn)換。比如,從int類型轉(zhuǎn)換到long類型。C蹄言中數(shù)據(jù)類型的轉(zhuǎn)換可以用分為兩類:隱式轉(zhuǎn)換(implicitconversions)和顯式轉(zhuǎn)換(explicitconversions)。這篇文章我們將詳細介紹這兩類轉(zhuǎn)換。.隱式類型轉(zhuǎn)換隱式轉(zhuǎn)換就是系統(tǒng)默認的、不需要加以聲明就可以進行的轉(zhuǎn)換。在隱式轉(zhuǎn)換過程中,編譯器無需對轉(zhuǎn)換進行詳細檢查就能夠安全地執(zhí)行轉(zhuǎn)換。比如從int類型轉(zhuǎn)換到long類型就是一種隱式轉(zhuǎn)換。隱式轉(zhuǎn)換一般不會失敗,轉(zhuǎn)換過程中也不會導致信息丟失。比如:inti=10;longl=i;裝箱轉(zhuǎn)換實際上就是一種隱式類型轉(zhuǎn)換。在本節(jié),我們還將講解以下隱式轉(zhuǎn)換的規(guī)則:隱式數(shù)值轉(zhuǎn)換隱式數(shù)值轉(zhuǎn)換包括以下幾種:從sbyte類型至Ushort,int,long,float,double,或decimal類型。從byte類型到

short,ushort,int,uint,long,ulong,float,double,或decimal或decimal類從short類型到int,long,float,double,或decimal類型。從ushort類型至Uint,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類型。其中,從int,uint,或long到float以及從long到double的轉(zhuǎn)換可能會導致精度下降,但決不會引起數(shù)量上的丟失。其它的隱式數(shù)值轉(zhuǎn)換則不會有任何信息丟失。結(jié)合我們在數(shù)據(jù)類型中學習到的值類型的范圍,我們可以發(fā)現(xiàn),隱式數(shù)值轉(zhuǎn)換實際上就是從低精度的數(shù)值類型到高精度的數(shù)值類型的轉(zhuǎn)換。從上面的10條我們可以看出,不存在到char類型的隱式轉(zhuǎn)換,這意味著其它整型值不能自動轉(zhuǎn)換為char類型。這一點我們需要特別注意。下面的程序給出了隱式數(shù)值轉(zhuǎn)換的例子。程序清單1-1:usingSystem;classTest(publicstaticvoidMain()(bytex=16;Console.WriteLine("x={0}",x);ushorty=x;Console.WriteLine("y={0}",y);y=65535;Console.WriteLine("y={0}",y);floatz=y;Console.WriteLine("z={0}",z);}}程序的輸出將是:x=16;y=16;y=65535;z=65535;如果我們在上面程序中的語句之后再加上一句:y=y+i;再重新編譯程序時,編譯器將會給出一條錯誤信息:cannotimplictlyconverttype'int'totype'ushort'這說明,從整數(shù)類型65536到無符號短整型y不存在隱式轉(zhuǎn)換。隱式枚舉轉(zhuǎn)換隱式枚舉轉(zhuǎn)換允許把十進制整數(shù)0轉(zhuǎn)換成任何枚舉類型,對應其它的整數(shù)則不存在這種隱式轉(zhuǎn)換。還是讓我們用例子來說明。程序清單1-2:usingSystem;enumWeekday{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};classTest{publicstaticvoidMain(){Weekdayday;day=0;Console.WriteLine(day);}}程序的輸出是:0但是如果我們把語句day=0改寫為day=1,編譯器就會給出錯誤:Cannotimplictlyconverttype'int'type'enum隱式引用轉(zhuǎn)換隱式引用轉(zhuǎn)換包括以下幾類:?從任何引用類型到對象類型的轉(zhuǎn)換?從類類型s到類類型t的轉(zhuǎn)換,其中s是t的派生類。?從類類型s到接口類型t的轉(zhuǎn)換,其中類s實現(xiàn)了接口to?從接口類型s到接口類型t的轉(zhuǎn)換,其中t是s的父接口。從元素類型為Ts的數(shù)組類型S向元素類型為Tt的數(shù)組類型T轉(zhuǎn)換,這種轉(zhuǎn)換需要滿足下列條件:?S和T只有元素的數(shù)據(jù)類型不同,但它們的維數(shù)相同。?Ts和Tt都是引用類型。?存在從Ts到Tt的隱式引用轉(zhuǎn)換?從任何數(shù)組類型到System.Array的轉(zhuǎn)換。?從任何代表類型到System.Delegate的轉(zhuǎn)換。?從任何數(shù)據(jù)類型或代表類型到System.ICLoneable的轉(zhuǎn)換。?從空類型(null)到任何引用類型的轉(zhuǎn)換。比如,下面的程序無法通過編譯,因為數(shù)組的元素類型是值類型,C#中不存在這樣的隱式轉(zhuǎn)換。程序清單1-3:usingSystem;classTestpublicstaticvoidMain(){float[]float_arr=newfloat[10];int[]int_arr=newint[10];float_arr=int_arr;而下面這段程序則是正確的:程序清單1-4:usingSystem;classClass1{}classClass2:Class1{}classTestpublicstaticvoidMain(){Class1[]class1_arr=newClass1[10];class2[]class2_arr=newClass2[10];class1_arr=class2_arr;}程序1-5很有趣,它給出了我們常用的值類型在系統(tǒng)環(huán)境中的原型定義。程序1-5:usingSystem;classTest(publicstaticvoidMain(){float[]float_arr=newfloat[10];double[]double_arr=newdouble[10];sbyte[]sbyte_arr=newsbyte[10];byte[]byte_arr=newbyte[10];ushort[]ushort_arr=newushort[10];int[]int_arr=newint[10];10ng[]long_arr=newlong[10];string[]string_arr=newstring[10];console.WriteLine(float_arr);Console.WriteLine(double_arr);Console.WriteLine(sbyte_arr);Console.WriteLine(byte_arr);Console.WriteLine(ushort_arr);Console.WriteLine(int_arr);Console.WriteLine(long_arr);Console.WriteLine(string_arr);)程序的輸出結(jié)果是:System.Single[];System.Double[];System.Sbyte[];System.Byte[];System.Int16[];system.Int32[];System.Int64口;System.String[];2.C#的顯式類型轉(zhuǎn)換顯式類型轉(zhuǎn)換,又叫強制類型轉(zhuǎn)換。與隱式轉(zhuǎn)換正好相反,顯式轉(zhuǎn)換需要用戶明確地指定轉(zhuǎn)換的類型。比如下面的例子把一個類型顯式轉(zhuǎn)換為類型:longl=5000;inti=(int)l;拆箱轉(zhuǎn)換就是一種顯式轉(zhuǎn)換。這里我們還將講解以下轉(zhuǎn)換的規(guī)則:顯式數(shù)值轉(zhuǎn)換顯式枚舉轉(zhuǎn)換顯式引用轉(zhuǎn)換

顯式轉(zhuǎn)換可以發(fā)生在表達式的計算過程中它并不是總能成功,而且顯式轉(zhuǎn)換可以發(fā)生在表達式的計算過程中它并不是總能成功,而且常常可能引起信息丟失。顯式轉(zhuǎn)換包括所有的隱式轉(zhuǎn)換,也就是說把任何系統(tǒng)允許的隱式轉(zhuǎn)換寫成顯式轉(zhuǎn)換的形式都是允許的,如:inti=10;longl=(long)i;顯式數(shù)值轉(zhuǎn)換顯式數(shù)值轉(zhuǎn)換是指當不存在相應的隱式轉(zhuǎn)換時,從一種數(shù)字類型到另一種數(shù)字類型的轉(zhuǎn)換。包括:從sbyte至Ubyte,ushort,uint,ulong,或char。從byte到sbyte或char。從short至Usbyte,byte,ushort,uint,ulong,或char。從ushort至Usbyte,byte,short,或char。從int至Usbyte,byte,short,ushort,uint,ulong,或char。從uint至Usbyte,byte,short,ushort,int,或char。從long至Usbyte,byte,short,ushort,int,uint,ulong,或char。從ulong至Usbyte,byte,short,ushort,int,uint,long,或char。從char至Usbyte,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。decimalsbyte,byte,short,ushort,int,uint,long,ulong,char,float,或double。這種類型轉(zhuǎn)換有可能丟失信息或?qū)е庐惓伋?,轉(zhuǎn)換按照下列規(guī)則進行:?對于從一種整型到另一種整型的轉(zhuǎn)換,編譯器將針對轉(zhuǎn)換進行溢出檢測,如果沒有發(fā)生溢出,轉(zhuǎn)換成功,否則拋出一個OverflowException異常。這種檢測還與編譯器中是否設(shè)定了checked選項有關(guān)。?對于從float,double,或decimal到整型的轉(zhuǎn)換,源變量的值通過舍入到最接近的整型值作為轉(zhuǎn)換的結(jié)果。如果這個整型值超出了目標類型的值域,則將拋出一個OverflowException異常。?對于從double到float的轉(zhuǎn)換,double值通過舍入取最接近的float值。如果這個值太小,結(jié)果將變成正0或負0;如果這個值太大,將變成正無窮或負無窮。如果原double值是Nan,則轉(zhuǎn)換2果也是NaN?對于從float或double到decimal的轉(zhuǎn)換,源值將轉(zhuǎn)換成小數(shù)形式并通過舍入取到小數(shù)點后28位(如果有必要的話)。如果源值太小,則結(jié)果為0;如果太大以致不能用小數(shù)表示,或是無窮和NaN,則將拋出InvalidCastException異常。?對于從decimal到float或double的轉(zhuǎn)換,小數(shù)的值通過舍入取最接近的值。這種轉(zhuǎn)換可能會丟失精度,但不會引起異常。程序清單2-1:usingsystem;classTest{staticvoidMain(){longlongValue=Int64.MaxValue;intintValue=(int)longValue;Console.WriteLine("(int){0}={1}”,longValue,intValue);}}這個例子把一個int類型轉(zhuǎn)換成為long類型,輸出結(jié)果是:(int)9223372036854775807=-1這是因為發(fā)生了溢出,從而在顯式類型轉(zhuǎn)換時導致了信息丟失。顯式枚舉轉(zhuǎn)換顯式枚舉轉(zhuǎn)換包括以下內(nèi)容:?從sbye,byte,short,ushort,int,uint,long,ulong,char,float,double,或decimal到任何枚舉類型。?從任何枚舉類型到sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,或decimal。?從任何枚舉類型到任何其它枚舉類型。顯式枚舉轉(zhuǎn)換是這樣進行的:它實際上是枚舉類型的元素類型與相應類型之間的隱式或顯式轉(zhuǎn)換。比如,有一個元素類型為int的枚舉類型E,則當執(zhí)行從E到byte的顯式枚舉轉(zhuǎn)換時,實際上作的是從int到byte的顯式數(shù)字轉(zhuǎn)換;當執(zhí)行從byte到E的顯式枚舉轉(zhuǎn)換時,實際上是執(zhí)行byte到int的隱式數(shù)字轉(zhuǎn)換。比如,對程序1-2,我們改寫如下:程序清單2-2:usingSystem;enumWeekday{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};classTest{publicstaticvoidMain(){Weekdayday;day=(Weekday)3;Console.WriteLine(day);))程序的輸出是:32.3顯式引用轉(zhuǎn)換顯式引用轉(zhuǎn)換包括:?從對象到任何引用類型?從類類型S到類類型T,其中S是T的基類。?從基類型S到接口類型T,其中S不是密封類,而且沒有實現(xiàn)To?從接口類型S到類類型T,其中T不是密封類,而且沒有實現(xiàn)So?從接口類型S到接口類型T,其中S不是T的子接口。從元素類型為Ts的數(shù)組類型S到

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論