




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(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)換(implicitconversions)和顯式轉(zhuǎn)換(explicitconversions)。這篇文章我們將詳細(xì)介紹這兩類轉(zhuǎn)換。1隱式類型轉(zhuǎn)換隱式轉(zhuǎn)換就是系統(tǒng)默認(rèn)的、不需要加以聲明就可以進(jìn)行的轉(zhuǎn)換。在隱式轉(zhuǎn)換過程中,編譯器無需對(duì)轉(zhuǎn)換進(jìn)行詳細(xì)檢查就能夠安全地執(zhí)行轉(zhuǎn)換。比如從int類型轉(zhuǎn)換到long類型就是一種隱式轉(zhuǎn)換。隱式轉(zhuǎn)換一般不會(huì)失敗,轉(zhuǎn)換過程中也不會(huì)導(dǎo)致信息丟失。比如:inti=10;longl=
2、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類型到Iong,float,double,或dec
3、imal類型。從uint類型到Iong,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)換可能會(huì)導(dǎo)致精度下降,但決不會(huì)引起數(shù)量上的丟失。其它的隱式數(shù)值轉(zhuǎn)換則不會(huì)有任何信息丟失。結(jié)合我們?cè)跀?shù)據(jù)類型中學(xué)習(xí)到的值類型的范圍,我們可
4、以發(fā)現(xiàn),隱式數(shù)值轉(zhuǎn)換實(shí)際上就是從低精度的數(shù)值類型到高精度的數(shù)值類型的轉(zhuǎn)換。從上面的10條我們可以看出,不存在到char類型的隱式轉(zhuǎn)換,這意味著其它整型值不能自動(dòng)轉(zhuǎn)換為char類型。這一點(diǎn)我們需要特別注意。下面的程序給出了隱式數(shù)值轉(zhuǎn)換的例子。程序清單1-1:usingSystem;classTestpublicstaticvoidMain()bytex=16;Console.WriteLine("x=0",x);ushorty=x;Console.WriteLine("y=0",y);y=65535;Console.WriteLine("y=0&
5、quot;,y);floatz=y;Console.WriteLine("z=0",z);程序的輸出將是:x=16;y=16;y=65535;z=65535;如果我們?cè)谏厦娉绦蛑械恼Z句之后再加上一句:y=y+1;再重新編譯程序時(shí),編譯器將會(huì)給出一條錯(cuò)誤信息:cannotimplictlyconverttype'int'totype'ushort'這說明,從整數(shù)類型65536到無符號(hào)短整型y不存在隱式轉(zhuǎn)換。1.2隱式枚舉轉(zhuǎn)換隱式枚舉轉(zhuǎn)換允許把十進(jìn)制整數(shù)0轉(zhuǎn)換成任何枚舉類型,對(duì)應(yīng)其它的整數(shù)則不存在這種隱式轉(zhuǎn)換。還是讓我們用例子來說明。程序清單1-
6、2:usingSystem;enumWeekdaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;classTestpublicstaticvoidMain()Weekdayday;day=0;Console.WriteLine(day);程序的輸出是:但是如果我們把語句day=0改寫為day=1,編譯器就會(huì)給出錯(cuò)誤:Cannotimplictlyconverttype'int'type'enum'1.3隱式引用轉(zhuǎn)換隱式引用轉(zhuǎn)換包括以下幾類:從任何引用類型到對(duì)象類型的轉(zhuǎn)換從類類型s到類類型t的轉(zhuǎn)換
7、,其中s是t的派生類。從類類型s到接口類型t的轉(zhuǎn)換,其中類s實(shí)現(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都是引用類型。S在從Ts到Tt的隱式引用轉(zhuǎn)換從任何數(shù)組類型到System.Array的轉(zhuǎn)換。從任何代表類型到System.Delegate的轉(zhuǎn)換。從任何數(shù)據(jù)類型或代表類型到System.ICLoneable的轉(zhuǎn)換。敬空類型(null)到任何引用類型的轉(zhuǎn)換。比如,下面的程序無法通過編譯,因?yàn)閿?shù)組的元素類型是值類型,C#中不存
8、在這樣的隱式轉(zhuǎn)換。程序清單1-3:usingSystem;classTestpublicstaticvoidMain()floatfloat_arr=newfloat10;intint_arr=newint10;float_arr=int_arr;而下面這段程序則是正確的:程序清單1-4:usingSystem;classClassiclassClass2:Class1classTestpublicstaticvoidMain()Class1class1_arr=newClass110;class2class2_arr=newClass210;class1_arr=class2_arr;程序1
9、-5很有趣,它給出了我們常用的值類型在系統(tǒng)環(huán)境中的原型定義。程序1-5:usingSystem;classTestpublicstaticvoidMain()floatfloat_arr=newfloat10;doubledouble_arr=newdouble10;sbytesbyte_arr=newsbyte10;bytebyte_arr=newbyte10;ushortushort_arr=newushort10;intint_arr=newint10;Ionglong_arr=newIong10;stringstring_arr=newstring10;console.WriteLin
10、e(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.Int
11、32;System.Int64;System.String;2.C#的顯式類型轉(zhuǎn)換顯式類型轉(zhuǎn)換,又叫強(qiáng)制類型轉(zhuǎn)換。與隱式轉(zhuǎn)換正好相反,顯式轉(zhuǎn)換需要用戶明確地指定轉(zhuǎn)換的類型。比如下面的例子把一個(gè)類型顯式轉(zhuǎn)換為類型:long1=5000;inti=(int)l;拆箱轉(zhuǎn)換就是一種顯式轉(zhuǎn)換。這里我們還將講解以下轉(zhuǎn)換的規(guī)則:顯式數(shù)值轉(zhuǎn)換顯式枚舉轉(zhuǎn)換顯式引用轉(zhuǎn)換顯式轉(zhuǎn)換可以發(fā)生在表達(dá)式的計(jì)算過程中。它并不是總能成功,而且常??赡芤鹦畔G失。顯式轉(zhuǎn)換包括所有的隱式轉(zhuǎn)換,也就是說把任何系統(tǒng)允許的隱式轉(zhuǎn)換寫成顯式轉(zhuǎn)換的形式都是允許的,如:inti=10;longl=(long)i;2.1顯式數(shù)值轉(zhuǎn)換顯式數(shù)值轉(zhuǎn)
12、換是指當(dāng)不存在相應(yīng)的隱式轉(zhuǎn)換時(shí),從一種數(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或cha
13、r。從ulong至Usbyte,byte,short,ushort,int,uint,long或char。從char到sbyte,byte或short。從float至Usbyte,byte,short,ushort,int,uint,long,uIong,char或decimal0從double至Usbyte,byte,short,ushort,int,uint,long,uIong,char,float或decimal。從decimalUsbyte,byte,short,ushort,int,uint,long,uIong,char,float或double。這種類型轉(zhuǎn)換有可能丟失信息或?qū)е?/p>
14、異常拋出,轉(zhuǎn)換按照下列規(guī)則進(jìn)行:寸于從一種整型到另一種整型的轉(zhuǎn)換,編譯器將針對(duì)轉(zhuǎn)換進(jìn)行溢出檢測(cè),如果沒有發(fā)生溢出,轉(zhuǎn)換成功,否則拋出一個(gè)OverflowException異常。這種檢測(cè)還與編譯器中是否設(shè)定了checked選項(xiàng)有關(guān)。對(duì)于從float,double,或decimal到整型的轉(zhuǎn)換,源變量的值通過舍入到最接近的整型值作為轉(zhuǎn)換的結(jié)果。如果這個(gè)整型值超出了目標(biāo)類型的值域,則將拋出一個(gè)OverflowException異常。對(duì)于從double到float的轉(zhuǎn)換,double值通過舍入取最接近的float值。如果這個(gè)值太小,結(jié)果將變成正0或負(fù)0;如果這個(gè)值太大,將變成正無窮或負(fù)無窮。如果原do
15、uble值是Nan,則轉(zhuǎn)換結(jié)果也是NaN。對(duì)于從float或double到decimal的轉(zhuǎn)換,源值將轉(zhuǎn)換成小數(shù)形式并通過舍入取到小數(shù)點(diǎn)后28位(如果有必要的話)。如果源值太小,則結(jié)果為0;如果太大以致不能用小數(shù)表示,或是無窮和NaN,則將拋出InvalidCastException異常。對(duì)于從decimal到float或double的轉(zhuǎn)換,小數(shù)的值通過舍入取最接近的值。這種轉(zhuǎn)換可能會(huì)丟失精度,但不會(huì)引起異常。程序清單2-1:usingsystem;classTeststaticvoidMain()longIongValue=lnt64.MaxValue;intintValue=(int)lo
16、ngValue;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,long,uIong,char,float,double或decimal至U任何枚舉類型。從任何枚舉類型到sbyte,byte,short,ushort,int,uint,long,uIo
17、ng,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)換。比如,對(duì)程序1-2,我們改寫如下:程序清單2-2:usingSystem;enumWeekdaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;classTestpublicstaticvoidMain()Weekdayday;day=(Weekday)3;Console.WriteLine(day);程序的輸出是:32.3顯式引用轉(zhuǎn)換顯式引用轉(zhuǎn)換包括:從對(duì)象到任何引用類型從類類型S到類類型T,其中S是T的基類。從基類型S到接口類型T,其中S不是密封類,而且沒有實(shí)現(xiàn)To敬接口類型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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)業(yè)園區(qū)入駐合同協(xié)議
- 關(guān)于推進(jìn)跨部門合作項(xiàng)目的工作計(jì)劃
- 關(guān)于采購流程的往來文書說明
- 商務(wù)會(huì)議溝通要點(diǎn)及會(huì)議紀(jì)要模板
- 健康管理平臺(tái)的構(gòu)建及運(yùn)營規(guī)劃
- 機(jī)器人智能化生產(chǎn)線建設(shè)委托代理合同
- 交通物流調(diào)度管理系統(tǒng)建設(shè)方案
- 房屋預(yù)約買賣合同
- 木材原木購銷合同
- 2025年版《認(rèn)識(shí)大熊貓》課件發(fā)布
- 城市軌道交通乘客服務(wù)課件(完整版)
- 圍手術(shù)期肺部感染
- 北師大版語文選修《蕭蕭》ppt課件1
- 大學(xué)生職業(yè)素養(yǎng)課件-5第五單元學(xué)會(huì)有效溝通-PPT課件
- 煤礦2021年重大安全風(fēng)險(xiǎn)分析預(yù)判防控報(bào)告全文
- 《傷逝》_魯迅課件__大學(xué)語文(基礎(chǔ)教育)
- 《談骨氣》課文閱讀(共2頁)
- 高考成績證明模板
- 蝴蝶蘭PPT課件
- 賓館做房記錄表
- 工業(yè)管道檢查報(bào)告
評(píng)論
0/150
提交評(píng)論