顯式轉換和強制轉換
如果要把短類型轉換為長類型,讓長類型保存短類型的所有位很簡單。然而,在其他情況下,
目標類型也許無法在不損失數據的情況下容納源值。
例如,假設我們希望把ushort值轉化為byte。
- ushort可以保存任何0~65535的值。
- byte只能保存0一255的值。
- 只要希望轉換的ushort值小于256,就不會損失數據。然而,如果大于256,最高位的數
據將會丟失。
例如,圖17-5演示了嘗試把值為1365的ushort類型轉換為byte類型會導致數據丟失。不
是源值的所有最高位都適合目標類型,這會導致溢出或數據丟失。源值是1365,而目標的最大
值只能是255。最終字節中的結果值為85,而不是1365。
很明顯,在所有可能的無符號16位ushort值中,只有相當小一部分(0.4%)能在不損失
數據的情況下安全轉換為無符號8位byte類型。其他值會導致數據溢出(overflow),產生其
他值。
強制轉換
對于預定義的類型,C#會自動將一個數據類型轉換為另一個數據類型,但只是針對那些從源
類型轉換為目標類型時不會發生數據丟失的情況。也就是說,如果源類型的任意值在被轉換成目
標類型時會丟失值,那么C#是不會提供這兩種類型的自動轉換的。如果希望對這樣的類型進行
轉換,就必須使用顯式轉換。這叫作強制轉換表達式。
如下代碼給出了一個強制轉換表達式的示例。它把varl的值轉換為sbyte類型。強制轉換
表達式的構成如下所示。
- 一對圓括號,里面是目標類型。
- 圓括號后是源表達式。
如果我們使用強制轉換表達式,就意味著要承擔執行操作可能引起的丟失數據的后果。這就
好比我們說:“不管是否會發生數據丟失,我知道在做什么,進行轉換吧。"(這時你一定要真正
清楚自己在做什么。)
例如,圖17-6演示了強制轉換表達式將兩個ushort類型的值轉換為byte類型。對于第一種
情況,沒有數據丟失。對于第二種情況,最高位丟失了,得到的值是85,很明顯不等于源值1365。