類型轉換的重要考慮是轉換的結果是否在目的地數據類型的範圍內。
擴大轉換會將值變更為數據類型,以允許原始數據的任何可能值。 擴大轉換會保留來源值,但可以變更其表示法。 這種情況會發生在您將整數類型轉換為 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)從數據類型或物件類型轉換成衍生自它的型別
縮小轉換不一定會在運行時間成功,而且可能會失敗或產生數據遺失。 如果目的地數據類型無法接收正在轉換的值,就會發生錯誤。 例如,數值轉換可能會導致溢位。 除非 Option Strict 語句 將類型檢查開關設定為 Off,否則編譯器不允許隱式地執行縮小型別轉換。
備註
隱藏縮小轉換錯誤,以便從集合中的 For Each…Next 項目轉換成迴圈控件變數。 如需詳細資訊和範例,請參閱「For Each...Next 語句」的「Narrowing Conversions」一節。
使用縮小轉換的時機
當您知道來源值可以轉換成目的地數據類型時,您就會使用縮小轉換,而不會發生錯誤或數據遺失。 例如,如果您知道 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
另請參閱
- 數據類型
- 在 Visual Basic 中的 類型轉換
- 隱含和明確轉換
- 字串與其他類型之間的轉換
- 如何:在 Visual Basic 中將物件轉換成另一種類型
- 陣列轉換
- 數據類型
- 類型轉換函式