擴展和縮小轉換 (Visual Basic)
型別轉換的重要考量在於轉換的結果是否在目的地資料類型的範圍內。
放大轉換會將值變更為資料類型,以允許原始資料的任何可能值。 放大轉換會保留來源值,但可以變更其表示法。 如果您從整數型別轉換成 Decimal
,或從 Char
轉換成 String
,就會發生此情況。
「縮小轉換」 (narrowing conversion) 會將值變更為資料類型,而可能無法保留一些可能的值。 例如,當小數值轉換成整數型別時會四捨五入,而要轉換成 Boolean
的數值型別會縮減為 True
或 False
。
擴展轉換
下表顯示標準放大轉換。
資料類型 | 放大至資料類型 1 |
---|---|
SByte | SByte , Short , Integer , Long , Decimal , Single , Double |
位元組 | Byte , Short , UShort , Integer , UInteger , Long , ULong , Decimal , Single , Double |
Short | Short , Integer , Long , Decimal , Single , Double |
UShort | UShort , Integer , UInteger , Long , ULong , Decimal , Single , Double |
整數 | Integer 、Long 、Decimal 、Single 、Double 2 |
UInteger | UInteger 、Long 、ULong 、Decimal 、Single 、Double 2 |
Long | Long 、Decimal 、Single 、Double 2 |
ULong | ULong 、Decimal 、Single 、Double 2 |
十進位 | Decimal 、Single 、Double 2 |
Single | Single 、Double |
Double | Double |
列舉類型 (列舉) | 其基礎整數型別和根據基礎類型放大的任何類型。 |
Char | Char 、String |
Char 陣列 |
Char 陣列、String |
任何型別 | Object |
任何衍生型別 | 任何由此衍生的基底類型 3。 |
任何型別 | 任何其實作的介面。 |
Nothing | 任何資料類型或物件類型。 |
1 根據定義,每個資料類型都會放大為本身。
2 從 Integer
、UInteger
、Long
、ULong
或 Decimal
轉換為 Single
或 Double
的轉換可能會導致精確度遺失,但永遠不會遺失範圍。 在此情況下,轉換不會造成資訊遺失。
3 從衍生型別轉換成其基底型別之一的轉換屬於放大,這點可能令人意外。 原因在於,衍生型別包含基底類型的所有成員,因此可視為基底類型的執行個體。 相對而言,基底類型不包含衍生類型所定義的任何新成員。
放大轉換在執行階段一律會成功,且永遠不會造成資料遺失。 不論 Option Strict 陳述式將類型檢查參數設定為 On
或 Off
,您都可以隱含地執行。
縮小轉換
標準縮小轉換包括下列類型:
上表中放大轉換的反向方向 (但每個類型都會放大為自身)
Boolean (布林值) 與任何數值型別之間的任意方向轉換
從任何數值型別轉換成任何列舉類型 (
Enum
)將資料類型或物件類型轉換為自身衍生出的型別
Narrowing 轉換的執行階段不一定會成功,且可能會失敗或產生資料遺失。 如果目的地資料類型無法接收要轉換的值,就會發生錯誤。 例如,數值轉換可能會導致溢位。 除非 Option Strict 陳述式將類型檢查參數設定為 Off
,否則編譯器不允許隱含地執行縮小轉換。
注意
從 For Each…Next
集合中的項目轉換成迴圈控制項變數時,系統會隱藏縮小轉換錯誤。 如需詳細資訊和範例,請參閱 For Each...Next 陳述式中的「縮小轉換」一節。
使用縮小轉換的時機
當您確定來源值可以轉換成目的地資料類型,且不會發生錯誤或資料遺失時,就可使用縮小轉換。 例如,如果您知道 String
只包含「True」或「False」,您可以使用 CBool
關鍵字將其轉換成 Boolean
。
轉換期間的例外狀況
由於放大轉換一律會成功,因此不會擲回例外狀況。 縮小轉換在失敗時,最常擲回的例外狀況如下:
InvalidCastException:如果未在兩種類型之間定義任何轉換
OverflowException:(僅限整數型別) 當要轉換的值對於目標類型而言太大時
如果類別或結構定義 CType 函式做為該類別或結構的轉換運算子,CType
可能會擲回其判斷適當的任何例外狀況。 此外,CType
可能會呼叫 Visual Basic 函式或 .NET Framework 方法,進而擲回各種例外狀況。
參考型別轉換期間的變更
參考型別的轉換只會複製值的指標。 值本身不會進行任何形式複製或變更。 唯一可以變更的是保存指標的變數資料類型。 在下列範例中,資料類型會從衍生類別轉換成其基底類別,但是這兩個變數目前指向的物件保持不變。
' Assume class cSquare inherits from class cShape.
Dim shape As cShape
Dim square As cSquare = New cSquare
' The following statement performs a widening
' conversion from a derived class to its base class.
shape = square