顧名思義,在明確要求編譯器把數值從一種資料型別轉換位另一種資料型別時,就是在執行顯式轉換。因此,這需要編寫額外的**,**的格式將隨著轉換方法的不同而不同。在學習顯式轉換**前,先看看如果不新增任何顯式轉換**,會發生什麼情況。
byte destinationvar;
short sourcevar = 7;
destinationvar = sourcevar;
console.writeline("sourcevar val:",sourcevar);
console.writeline("destinationvar val:",destinationvar);
如果編譯這段**,就會產生如下錯誤:
cannot implicitly convert type 'short' to 'byte'.an explicit conversion exists (are you missing a cast?)
幸運的是,c#編譯器可以檢測出沒有進行顯式轉換!
為了成功編譯這段**,需要新增**,進行顯式轉換。最簡單的方式是把short變數轉換為byte(由上述錯誤字串提出)。資料型別轉換是強迫資料從一種型別轉換為另一種型別,其語法比較簡單:
(destinationtype)sourcevar
這將把sourcevar中的值轉換為destinationtype。
注意:這只在某些情況下是可行的。彼此之間沒有什麼關係的型別不能進行資料型別轉換。
因此可以使用這個語法修改示例,把short變數強制轉換為byte:
byte destinationvar;
short sourcevar = 7;
destinationvar = (byte)sourcevar;
console.writeline("sourcevar val: ",sourcevar);
console.writeline("destinationvar val: ",destinationvar);
得到如下結果:
sourcevar val: 7
destinationvar val: 7
在試圖把乙個值轉換為不合適的變數時,會發生什麼呢?如下所示:
byte destinationvar;
short sourcevar = 281;
destinationvar = (byte)sourcevar;
console.writeline("sourcevar val: ",sourcevar);
console.writeline("destinationvar val: ",destinationvar);
結果如下:
sourcevar val: 281
destinationvar val: 25
會發生什麼?如果看看這兩個數字的二進位制表示,以及可以儲存在byte中的最大值255;
281 = 100011001
25 = 000011001
255 = 011111111
可以看出,源資料的最左邊一位丟失了。這會引出乙個問題:何時會丟失資料?顯然,當需要顯式的把一種資料型別轉換為另一種資料型別時,最好知道是否有資料丟失了。如果不知道這些,就會產生嚴重的問題,例如計帳應用程式或確定火箭飛往月球的軌道的應用程式。
一種方式是簡單的檢查源變數的值,把它與目標變數的取值範圍進行比較。還有另乙個技術,迫使系統特別注意執行期間的轉換。在把乙個值放在乙個變數中時,如果該值過大,不能放在該型別的變數中,就會導致一處,這就需要檢查。
這裡要用到兩個關鍵字checked和unchecked,稱為表示式的溢位檢查環境。以下述方式使用這兩個關鍵字:
checked(expression)
unchecked(expression)
byte destinationvar;
short sourcevar = 281;
destinationvar = checked((byte)sourcevar);
console.writeline("sourcevar val: ",sourcevar);
console.writeline("destinationvar val: ",destinationvar);
在執行這段**時,程式會崩潰,並顯示如圖5-1所示的錯誤資訊。但是,在這段**中,如果用unchecked替代checked,就會得到與以前一樣的結果,不會出現錯誤。這與前面的預設操作是一樣的。
除了這兩個關鍵字以外,還可以配置應用程式,讓這種型別的表示式都包含checked關鍵字,除非表示式明確使用unchecked關鍵字,總之是可以改變溢位檢查的預設設定的。為此,應修改專案的屬性:在vs中右擊solution explorer視窗中的專案,選擇properties選項。單擊視窗右邊的build,開啟build設定,要修改的屬性是乙個advanced設定,所以單擊advanced按鈕。在開啟的對話方塊中,選中check for arithmetic overflow/underflow選項,在預設情況下,這個設定是被禁用的,啟用它可以進行如上所述的checked操作。
顯式型別轉換 隱式型別轉換 變數作用域
妙味課堂 1 顯式型別轉換 強制型別轉換 parseint可以把字串轉化為數字 或者說從字串中提取數字 12.6 12 12px34 12 abc nan not a number 從左到右是數字取出,碰到不是數字的停止 parsefloat把字串轉化為小數 求和器 注意 1 nan和任何東西相加還...
顯式型別轉換和隱式型別轉換
typeof六種資料型別 number string boolean undefined object function var num 123 console.log typeof num number var num1 true console.log typeof num1 string va...
C 顯式型別轉換
對於型別轉換,我在查資料的時候看到了一種很有意思的解釋,我們可以這樣理解型別轉換 某塊記憶體中的資料是不變的,而型別就是我們戴上的眼鏡,當我們戴上一種眼鏡後,我們就會用對應的型別來解釋記憶體中的資料,這樣不同的解釋就得到了不同的資訊。所謂強制型別轉換實際上就是換上另一副眼鏡後再來看同樣的那塊記憶體資...