版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C#的隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換C#的隱式類型轉(zhuǎn)換在C#語言中,一些預(yù)定義的數(shù)據(jù)類型之間存在著預(yù)定義的轉(zhuǎn)換。比如,從int類型轉(zhuǎn)換到long類型。C#語言中數(shù)據(jù)類型的轉(zhuǎn)換可以用分為兩類:隱式轉(zhuǎn)換(implicit conversions)和顯式轉(zhuǎn)換(explicit conversions)。這篇文章我們將詳細(xì)介紹這兩類轉(zhuǎn)換。1. 隱式類型轉(zhuǎn)換隱式轉(zhuǎn)換就是系統(tǒng)默認(rèn)的、不需要加以聲明就可以進(jìn)行的轉(zhuǎn)換。在隱式轉(zhuǎn)換過程中,編譯器無需對轉(zhuǎn)換進(jìn)行詳細(xì)檢查就能夠安全地執(zhí)行轉(zhuǎn)換。比如從int類型轉(zhuǎn)換到long類型就是一種隱式轉(zhuǎn)換。隱式轉(zhuǎn)換一般不會失敗,轉(zhuǎn)換過程中也不會導(dǎo)致信息丟失。比如:int i=10;l
2、ong l=i;裝箱轉(zhuǎn)換實(shí)際上就是一種隱式類型轉(zhuǎn)換。在本節(jié),我們還將講解以下隱式轉(zhuǎn)換的規(guī)則:1.1 隱式數(shù)值轉(zhuǎn)換隱式數(shù)值轉(zhuǎn)換包括以下幾種:從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,doub
3、le,或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)換可能會導(dǎo)致精度下降,但決不會引起數(shù)量上的丟失。其它的隱式數(shù)值轉(zhuǎn)換則不會有任何信息丟失。結(jié)合我們在數(shù)據(jù)類型中學(xué)習(xí)到的值類型
4、的范圍,我們可以發(fā)現(xiàn),隱式數(shù)值轉(zhuǎn)換實(shí)際上就是從低精度的數(shù)值類型到高精度的數(shù)值類型的轉(zhuǎn)換。從上面的10條我們可以看出,不存在到char類型的隱式轉(zhuǎn)換,這意味著其它整型值不能自動轉(zhuǎn)換為char類型。這一點(diǎn)我們需要特別注意。下面的程序給出了隱式數(shù)值轉(zhuǎn)換的例子。程序清單1-1:using System;class Testpublic static void Main()byte x=16;Console.WriteLine("x=0",x);ushort y=x;Console.WriteLine("y=0",y);y=65535;Console.WriteL
5、ine("y=0",y);float z=y;Console.WriteLine("z=0",z);程序的輸出將是:x=16;y=16;y=65535;z=65535;如果我們在上面程序中的語句之后再加上一句:y=y+1;再重新編譯程序時(shí),編譯器將會給出一條錯(cuò)誤信息:can not implictly convert type 'int' to type 'ushort'這說明,從整數(shù)類型65536到無符號短整型y不存在隱式轉(zhuǎn)換。1.2 隱式枚舉轉(zhuǎn)換隱式枚舉轉(zhuǎn)換允許把十進(jìn)制整數(shù)0轉(zhuǎn)換成任何枚舉類型,對應(yīng)其它的整數(shù)則不存在這
6、種隱式轉(zhuǎn)換。還是讓我們用例子來說明。程序清單1-2:using System;enum WeekdaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;class Testpublic static void Main()Weekday day;day=0;Console.WriteLine(day);程序的輸出是:但是如果我們把語句day=0改寫為day=1,編譯器就會給出錯(cuò)誤:Can not implictly convert type 'int' type 'enum'1.3 隱式引用轉(zhuǎn)換隱式
7、引用轉(zhuǎn)換包括以下幾類:從任何引用類型到對象類型的轉(zhuǎn)換從類類型s到類類型t的轉(zhuǎn)換,其中s是t的派生類。從類類型s到接口類型t的轉(zhuǎn)換,其中類s實(shí)現(xiàn)了接口t。從接口類型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)到任何引用類型的
8、轉(zhuǎn)換。比如,下面的程序無法通過編譯,因?yàn)閿?shù)組的元素類型是值類型,C#中不存在這樣的隱式轉(zhuǎn)換。程序清單1-3:using System;class Testpublic static void Main()float float_arr=new float10;int int_arr=new int10;float_arr=int_arr;而下面這段程序則是正確的:程序清單1-4:using System;class Class1class Class2:Class1class Testpublic static void Main()Class1 class1_arr=new Class110
9、;class2 class2_arr=new Class210;class1_arr=class2_arr;程序1-5很有趣,它給出了我們常用的值類型在系統(tǒng)環(huán)境中的原型定義。程序1-5:using System;class Testpublic static void Main()float float_arr=new float10;double double_arr=new double10;sbyte sbyte_arr=new sbyte10;byte byte_arr=new byte10;ushort ushort_arr=new ushort10;int int_arr=new
10、int10;long long_arr=new long10;string string_arr=new string10;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é)果
11、是:System.Single;System.Double;System.Sbyte;System.Byte;System.Int16;system.Int32;System.Int64;System.String;2.C#的顯式類型轉(zhuǎn)換顯式類型轉(zhuǎn)換,又叫強(qiáng)制類型轉(zhuǎn)換。與隱式轉(zhuǎn)換正好相反,顯式轉(zhuǎn)換需要用戶明確地指定轉(zhuǎn)換的類型。比如下面的例子把一個(gè)類型顯式轉(zhuǎn)換為類型:long l=5000;int i=(int)l;拆箱轉(zhuǎn)換就是一種顯式轉(zhuǎn)換。這里我們還將講解以下轉(zhuǎn)換的規(guī)則:顯式數(shù)值轉(zhuǎn)換顯式枚舉轉(zhuǎn)換顯式引用轉(zhuǎn)換顯式轉(zhuǎn)換可以發(fā)生在表達(dá)式的計(jì)算過程中。它并不是總能成功,而且常常可能引起信息丟失。 顯式
12、轉(zhuǎn)換包括所有的隱式轉(zhuǎn)換,也就是說把任何系統(tǒng)允許的隱式轉(zhuǎn)換寫成顯式轉(zhuǎn)換的形式都是允許的,如:int i=10;long l=(long)i;2.1 顯式數(shù)值轉(zhuǎn)換顯式數(shù)值轉(zhuǎn)換是指當(dāng)不存在相應(yīng)的隱式轉(zhuǎn)換時(shí),從一種數(shù)字類型到另一種數(shù)字類型的轉(zhuǎn)換。包括:從sbyte到byte,ushort,uint,ulong,或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到
13、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。從de
14、cimal到sbyte,byte,short,ushort,int,uint,long,ulong,char,float,或double。這種類型轉(zhuǎn)換有可能丟失信息或?qū)е庐惓伋?,轉(zhuǎn)換按照下列規(guī)則進(jìn)行:對于從一種整型到另一種整型的轉(zhuǎn)換,編譯器將針對轉(zhuǎn)換進(jìn)行溢出檢測,如果沒有發(fā)生溢出,轉(zhuǎn)換成功,否則拋出一個(gè)OverflowException異常。這種檢測還與編譯器中是否設(shè)定了checked選項(xiàng)有關(guān)。對于從float,double,或decimal到整型的轉(zhuǎn)換,源變量的值通過舍入到最接近的整型值作為轉(zhuǎn)換的結(jié)果。如果這個(gè)整型值超出了目標(biāo)類型的值域,則將拋出一個(gè)OverflowException異常。
15、對于從double到float的轉(zhuǎn)換,double值通過舍入取最接近的float值。如果這個(gè)值太小,結(jié)果將變成正0或負(fù)0;如果這個(gè)值太大,將變成正無窮或負(fù)無窮。如果原double值是Nan,則轉(zhuǎn)換結(jié)果也是NaN。對于從float或double到decimal的轉(zhuǎn)換,源值將轉(zhuǎn)換成小數(shù)形式并通過舍入取到小數(shù)點(diǎn)后28位(如果有必要的話)。如果源值太小,則結(jié)果為0;如果太大以致不能用小數(shù)表示,或是無窮和NaN,則將拋出InvalidCastException異常。 對于從decimal到float或double的轉(zhuǎn)換,小數(shù)的值通過舍入取最接近的值。這種轉(zhuǎn)換可能會丟失精度,但不會引起異常。程序清單2-1
16、:using system;class Teststatic void Main()long longValue=Int64.MaxValue;int intValue=(int)longValue;Console.WriteLine("(int)0=1",longValue,intValue);這個(gè)例子把一個(gè)int類型轉(zhuǎn)換成為long類型,輸出結(jié)果是:(int)9223372036854775807=-1這是因?yàn)榘l(fā)生了溢出,從而在顯式類型轉(zhuǎn)換時(shí)導(dǎo)致了信息丟失。2.2 顯式枚舉轉(zhuǎn)換顯式枚舉轉(zhuǎn)換包括以下內(nèi)容:從sbye,byte,short,ushort,int,uint,l
17、ong,ulong,char,float,double,或decimal到任何枚舉類型。 從任何枚舉類型到sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,或decimal。 從任何枚舉類型到任何其它枚舉類型。顯式枚舉轉(zhuǎn)換是這樣進(jìn)行的:它實(shí)際上是枚舉類型的元素類型與相應(yīng)類型之間的隱式或顯式轉(zhuǎn)換。比如,有一個(gè)元素類型為int的枚舉類型E,則當(dāng)執(zhí)行從E到byte的顯式枚舉轉(zhuǎn)換時(shí),實(shí)際上作的是從int到byte的顯式數(shù)字轉(zhuǎn)換;當(dāng)執(zhí)行從byte到E的顯式枚舉轉(zhuǎn)換時(shí),實(shí)際上是執(zhí)行byte到int的隱式數(shù)字轉(zhuǎn)換。比如,對程序1-2,
18、我們改寫如下:程序清單2-2:using System;enum WeekdaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;class Testpublic static void Main()Weekday day;day=(Weekday)3;Console.WriteLine(day);程序的輸出是:32.3 顯式引用轉(zhuǎn)換顯式引用轉(zhuǎn)換包括:從對象到任何引用類型從類類型S到類類型T,其中S是T的基類。從基類型S到接口類型T,其中S不是密封類,而且沒有實(shí)現(xiàn)T。從接口類型S到類類型T,其中T不是密封類,而且沒有實(shí)現(xiàn)S。從接口類型S到接口類型T,其中S不是T的子接口。從元素類型為Ts的數(shù)組類型S到元素類型為Tt的數(shù)組類型T的轉(zhuǎn)換,這種轉(zhuǎn)換需要滿
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年企業(yè)間技術(shù)秘密轉(zhuǎn)讓與保密合同
- 2024《教育基金贈與合同》
- 2024年度二手挖掘機(jī)質(zhì)量保證合同
- 2024年奶牛養(yǎng)殖收購合同
- 2024年度融資合同融資項(xiàng)目及融資金額
- 2024年建筑工程屋面分包協(xié)議
- 2024年度★店鋪轉(zhuǎn)讓及培訓(xùn)協(xié)議
- 2024年度生物醫(yī)藥實(shí)驗(yàn)室安裝內(nèi)部承包合同
- 2024年企業(yè)間關(guān)于物聯(lián)網(wǎng)技術(shù)研發(fā)與應(yīng)用合作協(xié)議
- 2024供應(yīng)鏈金融借款合同
- 2023年溫州鹿城區(qū)區(qū)屬國企招聘選調(diào)筆試真題
- 拆除石籠護(hù)坡施工方案
- 【7道人教版期中】安徽省懷寧縣2023-2024學(xué)年七年級上學(xué)期期中考試道德與法治試卷(含詳解)
- 管理經(jīng)濟(jì)學(xué)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 9.2提高防護(hù)能力(課件)-2024-2025學(xué)年統(tǒng)編版道德與法治七年級上冊
- 汽車修理業(yè)務(wù)受理程序、服務(wù)承諾、用戶抱怨制度
- 2025屆福建省廈門市外國語學(xué)校高二數(shù)學(xué)第一學(xué)期期末考試試題含解析
- 貴陽一中2025屆高三10月高考適應(yīng)性月考(二) 思想政治試卷(含答案)
- 建筑垃圾消納處置場所建設(shè)可行性研究報(bào)告
- GB/T 44670-2024殯儀館職工安全防護(hù)通用要求
- 《中國成人肥厚型心肌病診斷與治療指南-2023》更新要點(diǎn)解讀
評論
0/150
提交評論