上面已經說到,隱式轉換就是不需要什麼文法申明,例如:
byte bt = 1;
short s = 35;
int x = bt; //將byte類型直接交給int類型,這就是一次隱式轉換
int y = s; //同上
轉換有一個前提,那就是只要能保證值不會發生任何變化,類型轉換就可以成功進行。但是,在轉換之前編譯器會判斷一次,這個判斷是不管值是否能夠保證的。編譯器只看類型的大小。所以隱式轉換的前提是,位元小的類型向大的轉換,且能夠保證值不發生變化就可以自動轉換。
上面兩個執行個體你應該看出來了,都是擴大轉換。比如下面執行個體,將int類型的轉換為byte類型這樣的縮小轉換,要想也隱式實現就會出錯,因為int類型比byte類型大,這就有可能導致資料丟失。所以編譯器會提示錯誤,如下例,我們先申明一個int類型的變數,然後試圖將這個int類型的變數隱式轉換為byte類型。2-20
圖 2-20
下表顯示了預定義的隱式數值轉換。隱式轉換可能在多種情形下發生,包括調用方法時和在指派陳述式中。
隱式轉換需要注意以下幾點:
可空類型隱式轉換為其它可空類型,應遵循表上表非可空類型的轉換規則。即int? 隱式轉換為long?、float?、double?和decimal?。
非可空類型隱式轉換為可空類型也遵循表上表中的轉換規則,即int隱式轉換為long?、float?、double?和decimal?。
可空類型不能隱式轉換為非可空類型,此時必須進行顯式轉換,如下一節所述。這是因為可空類型的值可以是null,但非可空類型不能表示這個值。
從 int、uint 或 long 到 float 的轉換以及從 long 到 double 的轉換的精度可能會降低,但數值大小不受影響。
不存在到 char 類型的隱式轉換。
不存在浮點型與 decimal 類型之間的隱式轉換。
int 類型的常數運算式可轉換為 sbyte、byte、short、ushort、uint 或 ulong,前提是常數運算式的值處於目標類型的範圍之內。
另外,以下場合不適合隱式轉換:
●int轉換為short--會遺失資料
●int轉換為uint--會遺失資料
●uint轉換為int--會遺失資料
●float轉換為int--會丟失小數點後面的所有資料
●任何數字類型轉換為char --會遺失資料
●decimal轉換為任何數字類型--因為decimal 類型的內部結構不同於整數和浮點數
●int? 轉換為int--可空類型的值可以是null
這些如果一定要轉換,就需要使用顯示轉換來強迫編譯器進行轉換了。
本文為天轟穿原著,轉載請註明出處及作者!