擴大和縮小轉換 (Visual Basic)

類型轉換的重要考慮是轉換的結果是否在目的地數據類型的範圍內。

擴大轉換會將值變更為數據類型,以允許原始數據的任何可能值。 擴大轉換會保留來源值,但可以變更其表示法。 這種情況會發生在您將整數類型轉換為 Decimal 或 Char 轉換為 String 時。

縮小轉換會將值變更為可能無法保存某些可能值的數據類型。 例如,當小數點值轉換成整數類型時會四捨五入,而要轉換成 Boolean 的數值型別會縮減為 True 或 False。

擴大轉換

下表顯示標準擴展轉換。

數據類型 擴展至數據類型 1
SByte SByte、Short、Integer、Long、Decimal、Single、Double
位元組 Byte、Short、UShort、Integer、UInteger、Long、ULong、Decimal、Single、Double
簡短 Short、Integer、Long、Decimal、Single、Double
UShort UShort、Integer、UInteger、Long、ULong、Decimal、Single、Double
整數 Integer、 Long、 Decimal、 Single、 Double2
UInteger UInteger、 Long、 ULong、 Decimal、 Single、 Double2
長 Long、、DecimalSingle、Double2
ULong ULong、、DecimalSingle、Double2
十進位 Decimal、、SingleDouble2
單一 Single、Double
雙 Double
任何列舉型別 (列舉) 其基礎整數型別和基礎類型擴展至的任何型別。
字符 Char、String
Char 陣列 Char 陣列 String
任何類型 物件
任何衍生類型 其衍生來源的任何基底類型 3。
任何類型 它實作的任何介面。
無 任何數據類型或物件類型。

1 根據定義,每個數據類型都會擴大為本身。

2 從 Integer、、UInteger、 LongULong或 Decimal 轉換成 Single 或 Double 的轉換可能會導致精確度遺失,但永遠不會遺失大小。 從這個意義上說,它們不會產生資訊遺失。

3 從衍生型別轉換成其中一個基底類型被視為擴展,這似乎令人驚訝。 理由是衍生類型包含基底類型的所有成員,因此它會限定為基底類型的實例。 相反的方向,基底類型不包含衍生型別所定義的任何新成員。

擴展轉換在運行時總是成功,且永不會導致數據丟失。 無論 Option Strict 語句 將類型檢查開關設定為 On 或 Off,您都可以隱含地執行它們。

縮小轉換

標準縮小轉換包括下列各項:

  • 上表中的擴大轉換的反向方向(除了每種類型都擴大到自身之外)

  • 布爾值與任何數值類型之間的任一方向轉換

  • 從任何數值型別轉換成任何列舉型別 (Enum)

  • 字串與任何數值類型、Boolean或日期之間的任一方向轉換

  • 從數據類型或物件類型轉換成衍生自它的型別

縮小轉換不一定會在運行時間成功,而且可能會失敗或產生數據遺失。 如果目的地數據類型無法接收正在轉換的值,就會發生錯誤。 例如,數值轉換可能會導致溢位。 除非 Option Strict 語句 將類型檢查開關設定為 Off,否則編譯器不允許隱式地執行縮小型別轉換。

備註

隱藏縮小轉換錯誤,以便從集合中的 For Each…Next 項目轉換成迴圈控件變數。 如需詳細資訊和範例,請參閱「For Each...Next 語句」的「Narrowing Conversions」一節。

使用縮小轉換的時機

當您知道來源值可以轉換成目的地數據類型時,您就會使用縮小轉換,而不會發生錯誤或數據遺失。 例如,如果您知道 String 包含「True」或「False」,您可以使用 CBool 關鍵詞將其轉換成 Boolean。

轉換期間的例外狀況

因為擴大轉換一律會成功,所以不會引發例外狀況。 縮小轉換失敗時,最常拋出下列例外狀況:

如果類別或結構定義 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  

另請參閱