c#的隱式型別轉換和顯式型別轉換
c#的隱式型別轉換 在
c#語言中,一些預定義的資料型別之間存在著預定義的轉換。比如,從
int型別轉換到
long
型別。c#
語言中資料型別的轉換可以用分為兩
類:隱式轉換(implicit conversions)
和顯式轉換
(explicit conversions)
。這篇文章我們將詳細介紹這兩類轉換。
1. 隱式型別轉換
隱式轉換就是系統預設的、不需要加以宣告就可以進行的轉換。在隱式轉換過程中,編譯器無需對轉換進行詳細檢查就能夠安全地執行轉換。
比如從int
型別轉換到
long
型別就是一種隱式轉換。隱式轉換一般不會失敗,轉換過程中也不會導致資訊丟失。
比如:int i=10;
long l=i;
裝箱轉換實際上就是一種隱式型別轉換。在本節,我們還將講解以下隱式轉換的規則:
1.1 隱式數值轉換
隱式數值轉換包括以下幾種:
●從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,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
的轉換可能會導致精度下降,但決不會引起數量上的丟失。其它的隱式數值轉換則不會
有任何資訊丟失。
結合我們在資料型別中學習到的值型別的範圍,我們可以發現,隱式數值轉換實際上就是從低精度的數值型別到高精度的數值型別的轉換。
從上面的10
條我們可以看出,不存在到
char
型別的隱式轉換,這意味著其它整型值不能自動轉換為
char
型別。這一點我們需要特別注意。
下面的程式給出了隱式數值轉換的例子。
程式清單1-1:
using system;
class test
public static void main()
byte x=16;
console.writeline("x=",x);
ushort y=x;
console.writeline("y=",y);
y=65535;
console.writeline("y=",y);
float z=y;
console.writeline("z=",z);
}程式的輸出將是:
x=16;
y=16;
y=65535;
z=65535;
y=y+1;
再重新編譯程式時,編譯器將會給出一條錯誤資訊:
can not implictly convert type 'int' to type 'ushort'
這說明,從整數型別65536
到無符號短整型
y不存在隱式轉換。
1.2 隱式列舉轉換
隱式列舉轉換允許把十進位制整數0
轉換成任何列舉型別,對應其它的整數則不存在這種隱式轉換。還是讓我們用例子來說明。
程式清單1-2:
using system;
enum weekday程式的輸出是:
但是如果我們把語句day=0
改寫為day=1
,編譯器就會給出錯誤:
can not implictly convert type 'int' type 'enum'
1.3 隱式引用轉換
隱式引用轉換包括以下幾類:
●從任何引用型別到物件型別的轉換
●從類型別s
到類型別
t的轉換,其中s是
t的派生類。
●從類型別s
到介面型別
t的轉換,其中類
s實現了介面t。
●從介面型別s
到介面型別
t的轉換,其中t是
s的父介面。
從元素型別為ts
的陣列型別
s向元素型別為
tt的陣列型別
t轉換,這種轉換需要滿足下列條件: ●s
和t只有元素的資料型別不同,但它們的維數相同。
●ts和tt
都是引用型別。
●存在從ts到tt
的隱式引用轉換
●從任何陣列型別到system.array
的轉換。
●從任何代表型別到system.delegate
的轉換。
●從任何資料型別或代表型別到system.icloneable
的轉換。
●從空型別(null)
到任何引用型別的轉換。
比如,下面的程式無法通過編譯,因為陣列的元素型別是值型別,c#
中不存在這樣的隱式轉換。
程式清單1-3:
using system;
class test
public static void main()=",longvalue,intvalue);
這個例子把乙個int
型別轉換成為
long
型別,輸出結果是:
(int)9223372036854775807=-1
這是因為發生了溢位,從而在顯式型別轉換時導致了資訊丟失。
2.2 顯式列舉轉換
顯式列舉轉換包括以下內容:
●從sbye,byte,short,ushort,int,uint,long,ulong,char,float,double,
或decimal
到任何列舉型別。
●從任何列舉型別到sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,
或decimal。
●從任何列舉型別到任何其它列舉型別。
顯式列舉轉換是這樣進行的:它實際上是列舉型別的元素型別與相應型別之間的隱式或顯式轉換。比如,有乙個元素型別為int
的列舉型別e,
則當執行從e
到byte
的顯式列舉轉換時,實際上作的是從
int到
byte
的顯式數字轉換;當執行從
byte到e
的顯式列舉轉換時,實際上是執行
byte到
int的隱式數字轉換。
比如,對程式1-2,
我們改寫如下:
程式清單2-2:
using system;
enum weekday{
sunday,monday,tuesday,wednesday,thursday,friday,saturday
class test
public static void main(){
weekday day;
day=(weekday)3;
console.writeline(day);
程式的輸出是:
2.3 顯式引用轉換
顯式引用轉換包括:
●從物件到任何引用型別
●從類型別s
到類型別
t,其中s是
t的基類。
●從基型別s
到介面型別
t,其中
s不是密封類,而且沒有實現t。
●從介面型別s
到類型別
t,其中
t不是密封類,而且沒有實現s。
●從介面型別s
到介面型別
t,其中s不是
t的子介面。
從元素型別為ts
的陣列型別
s到元素型別為
tt的陣列型別
t的轉換,這種轉換需要滿足下列條件: ●s
和t只有元素的資料型別不同,而維數相同。
●ts和tt
都是引用型別。
●存在從ts到tt
的顯式引用轉換。
●從system.array
到陣列型別。
●從system.delegate
到代表型別。
●從system.icloneable
到陣列型別或代表型別。
顯式引用轉換發生在引用型別之間,需要在執行時檢測以確保正確。
為了確保顯式引用轉換的正常執行,要求源變數的值必須是null
或者它所引用的物件的型別可以被隱式引用轉換為目標型別。否則顯式引用轉
換失敗,將丟擲乙個invalidcastexception
異常。
不論隱式還是顯式引用轉換,雖然可能會改變引用值的型別,卻不會改變值本身。
顯式型別轉換和隱式型別轉換
typeof六種資料型別 number string boolean undefined object function var num 123 console.log typeof num number var num1 true console.log typeof num1 string va...
JS型別和顯 隱式型別轉換
型別可以用 typeof 獲取。object型別,可以理解為引用型別,但是不完整。vara function console.log typeof 輸出 object console.log typeof 輸出 object console.log typeof null 輸出 object con...
顯式型別轉換 隱式型別轉換 變數作用域
妙味課堂 1 顯式型別轉換 強制型別轉換 parseint可以把字串轉化為數字 或者說從字串中提取數字 12.6 12 12px34 12 abc nan not a number 從左到右是數字取出,碰到不是數字的停止 parsefloat把字串轉化為小數 求和器 注意 1 nan和任何東西相加還...