擴展和縮小轉換 (Visual Basic)
型別轉換必須考慮轉換結果是否在目的資料型別範圍之內。
A 擴展轉換的值變更成可以允許對原始資料的任意可能數值的資料型別。 「擴展轉換」(Widening Conversion) 會保留原始值,但可能會變更其表示方法。 若要將轉換為一個整數類資料型別,這是Decimal,或從Char到String。
「縮小轉換」(Narrowing Conversion) 會變更資料型別的值,而此資料型別可能無法存放一些可能值。 例如,分數的值會捨入則會轉換為整數型別,以及數字型別轉換成Boolean ,會降低到其中一個True或False。
擴展轉換
下列資料表將說明標準的擴展轉換。
資料型別 |
擴展為資料型別 1 |
SByte, Short, Integer, Long, Decimal, Single, Double |
|
Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double |
|
Short, Integer, Long, Decimal, Single, Double |
|
UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double |
|
Integer, Long, Decimal, Single, Double2 |
|
UInteger, Long, ULong, Decimal, Single, Double 2 |
|
Long, Decimal, Single, Double 2 |
|
ULong, Decimal, Single, Double 2 |
|
Decimal, Single, Double 2 |
|
Single, Double |
|
Double |
|
任何列舉型別 (Enum) |
其基礎整數類資料型別和任何的基礎型別擴大後的型別。 |
Char, String |
|
Char 陣列 |
Char 陣列,String |
任何型別 |
|
所有的衍生型別 (Derived Type) |
任何基底型別衍生來源 3。 |
任何型別 |
它會實作任何介面。 |
任何的資料型別或物件型別而定。 |
1 依定義,每個資料型別都會擴展至本身。
2 從 Integer、UInteger、Long、ULong 或 Decimal 轉換成 Single 或 Double,可能會導致精確度喪失,但決不會喪失其大小範圍。 因此這些轉換並不會使資料遺漏。
3 由衍生型別擴展轉換成其中一種基底型別,可能會讓人覺得意外。 原因是衍生型別包含有基底型別的所有成員,因此成為基底型別的執行個體。 反過來說,基底型別並不包含衍生型別所定義的成員。
在執行階段中進行的擴展轉換一定會成功,且決不會造成資料遺漏。 無論 Option Strict 陳述式 設定型別檢查 (Type Checking) 為 On 或 Off,您都可以執行隱含式擴展轉換。
縮小轉換
標準的縮小轉換包括:
上述表格中擴展轉換的反向轉換 (不包括任何擴展至本身的型別)
布林值 (Boolean) 與任何數字型別 (Numeric Type) 之間的雙向轉換
從任何數字型別轉換為任何列舉型別 (Enum)
從資料型別或物件型別轉換為從其衍生的型別
在執行階段中進行的縮小轉換不一定會成功,可能會失敗並造成資料遺漏。 若目的資料型別無法接受轉換的值,就會發生錯誤。 例如,數字轉換可能會導致溢位 (Overflow)。 除非 Option Strict 陳述式 設定型別檢查為 Off,否則編譯器 (Compiler) 不會允許您執行隱含式縮小轉換。
注意事項 |
---|
從 For Each…Next 集合中的項目轉換至迴圈控制變數時,會隱藏縮小轉換錯誤。如需詳細資訊和範例,請參閱 For Each...Next 陳述式 (Visual Basic) 中的<縮小轉換>一節。 |
何時使用縮小轉換
當您知道將來源值轉換為目的資料型別時,不會產生錯誤或造成資料遺漏,就可以使用縮小轉換。 比方說,如果您有String您會知道包含"True"False",您可以使用CBool關鍵字] 以將它轉換成Boolean。
轉換時的例外狀況
因為擴展轉換一定會成功,所以不會有例外狀況。 當縮小轉換失敗時,最可能擲回下列例外狀況:
InvalidCastException - 如果兩個型別之間未定義轉換方式
OverflowException - (僅限整數型別) 如果轉換值對目標型別 (Target Type) 來說太大
如果類別或結構定義 CType 函式 (Visual Basic)為來源或目標轉換運算子,CType 可能會擲回任何其認為適當的例外狀況。 此外,CType 可能會呼叫 Visual Basic 函式或 .NET Framework 方法,並因此擲回各類例外狀況。
參考型別轉換期間的變更
從「參考型別」(Reference Type) 進行的轉換只會複製值的指標。 在任何情況下都不會複製或變更值本身。 唯一會變更的就是存放指標的變數的資料型別。 在以下範例中,資料型別從衍生類別轉換為其基底類別,但轉換後兩變數所指向的物件並未變更。
' 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