擴展和縮小轉換
更新: 2008 年 7 月
型別轉換必須考慮轉換結果是否在目的資料型別範圍之內。「擴展轉換」會變更資料型別的值,而此資料型別能夠與原始資料的任何可能值相符。「縮小轉換」會變更資料型別的值,而此資料型別可能無法存放一些可能值。
擴展轉換
下列資料表將說明標準的擴展轉換。
資料型別 |
擴展為資料型別 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, Double2 |
|
Long, Decimal, Single, Double2 |
|
ULong, Decimal, Single, Double2 |
|
Decimal, Single, Double2 |
|
Single, Double |
|
Double |
|
任何列舉型別 (Enum) |
其基礎整數類資料型別 (Integral Type),以及任何由這個基礎型別擴展出來的型別 |
Char, String |
|
Char 陣列 |
Char 陣列,String |
任何型別 |
|
所有的衍生型別 (Derived Type) |
任何衍生的基底型別 (Base 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¡KNext 集合中的項目轉換至迴圈控制變數時,會隱藏縮小轉換錯誤。如需詳細資訊和範例,請參閱 For Each...Next 陳述式 (Visual Basic) 中的<縮小轉換>一節。 |
何時使用縮小轉換
當您知道將來源值轉換為目的資料型別時,不會產生錯誤或造成資料遺漏,就可以使用縮小轉換。例如,若您知道的 String 中包含有 "True" 或 "False",您就可以使用 CBool 關鍵字來將其轉換為 Boolean。
轉換時的例外狀況
因為擴展轉換一定會成功,所以不會有例外狀況。當縮小轉換失敗時,最可能擲回下列例外狀況:
InvalidCastException — 如果兩個型別之間未定義轉換方式
OverflowException — (僅限整數型別) 如果轉換值對目標型別 (Target Type) 來說太大
如果類別或結構定義 CType 函式為來源或目標轉換運算子,CType 可能會擲回任何其認為適當的例外狀況。此外,CType 可能會呼叫 Visual Basic 函式或 .NET Framework 方法,並因此擲回各類例外狀況。
請參閱
工作
HOW TO:在 Visual Basic 中將物件轉換成其他型別
概念
參考
其他資源
變更記錄
日期 |
記錄 |
原因 |
---|---|---|
2008 年 7 月 |
加入關於縮小轉換和 For Each¡KNext 的備註。 |
客戶回函。 |