隱含和明確轉換 (Visual Basic)
「隱含轉換」不需要原始程式碼中的任何特殊語法。 在下列範例中,Visual Basic 會先將 k
的值隱含轉換成單精確度浮點值,再將其指派給 q
。
Dim k As Integer
Dim q As Double
' Integer widens to Double, so you can do this with Option Strict On.
k = 432
q = k
「明確轉換」會使用類型轉換關鍵字。 Visual Basic 提供幾個這類關鍵字,可將括弧中的運算式強制轉型成所需的資料類型。 這些關鍵字的作用就像函式,但編譯器會產生內嵌程式碼,因此執行速度會比函式呼叫快一些。
在上述範例的下列延伸模組中,CInt
關鍵字會先將 q
的值轉換回整數,再將其指派給 k
。
' q had been assigned the value 432 from k.
q = Math.Sqrt(q)
k = CInt(q)
' k now has the value 21 (rounded square root of 432).
轉換關鍵字
下表顯示可用的轉換關鍵字。
類型轉換關鍵字 | 將運算式轉換成資料類型 | 可允許轉換的運算式資料類型 |
---|---|---|
CBool |
Boolean 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、String 、Object |
CByte |
Byte 資料類型 | 任何數值類型 (包括 SByte 和列舉類型)、Boolean 、String 、Object |
CChar |
Char 資料類型 | String 、Object |
CDate |
Date 資料類型 | String 、Object |
CDbl |
Double 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、Boolean 、String 、Object |
CDec |
Decimal 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、Boolean 、String 、Object |
CInt |
Integer 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、Boolean 、String 、Object |
CLng |
Long 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、Boolean 、String 、Object |
CObj |
Object Data Type | 任何型別 |
CSByte |
SByte 資料類型 | 任何數值類型 (包括 Byte 和列舉類型)、Boolean 、String 、Object |
CShort |
Short 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、Boolean 、String 、Object |
CSng |
Single 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、Boolean 、String 、Object |
CStr |
String 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、Boolean 、Char 、Char 陣列、Date 、Object |
CType |
接在逗號 (, ) 後面指定的類型 |
轉換成「基礎資料型別」(Elementary Data Type) 時 (包括基礎型別的陣列),則為對應轉換關鍵字所允許的相同類型 轉換成「複合資料型別」時,則為其所實作介面及其繼承的來源類別 轉換成您已多載 CType 的類別或結構時,則為該類別或結構 |
CUInt |
UInteger 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、Boolean 、String 、Object |
CULng |
ULong 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、Boolean 、String 、Object |
CUShort |
UShort 資料類型 | 任何數值類型 (包括 Byte 、SByte 和列舉類型)、Boolean 、String 、Object |
CType 函式
CType 函式會在兩個引數上運作。 第一個是要轉換的運算式,而第二個是目的地資料類型或物件類別。 請注意,第一個引數必須是運算式,而不是類型。
CType
是「內嵌函式」,表示編譯的程式碼會進行轉換,通常不需要產生函式呼叫。 這改善效能。
如需 CType
與其他類型轉換關鍵字的比較,請參閱 DirectCast 運算子和 TryCast 運算子。
基礎型別
下列範例示範 CType
的用法。
k = CType(q, Integer)
' The following statement coerces w to the specific object class Label.
f = CType(w, Label)
複合型別
您可以使用 CType
將值轉換成複合資料型別,以及轉換成基礎型別。 您也可以使用它,將物件類別強制轉型成其中一個介面的類型,如下列範例所示。
' Assume class cZone implements interface iZone.
Dim h As Object
' The first argument to CType must be an expression, not a type.
Dim cZ As cZone
' The following statement coerces a cZone object to its interface iZone.
h = CType(cZ, iZone)
陣列型別
CType
也可以轉換陣列資料類型,如下列範例所示。
Dim v() As classV
Dim obArray() As Object
' Assume some object array has been assigned to obArray.
' Check for run-time type compatibility.
If TypeOf obArray Is classV()
' obArray can be converted to classV.
v = CType(obArray, classV())
End If
如需詳細資訊和範例,請參閱陣列轉換。
定義 CType 的類型
您可以在已定義的類別或結構上定義 CType
。 這可讓您在值與類別或結構的類型之間進行來回轉換。 如需詳細資訊和範例,請參閱操作說明:定義轉換運算子。
注意
與轉換關鍵字搭配使用的值對於目的地資料類型必須有效,否則會發生錯誤。 例如,如果您嘗試將 Long
轉換成 Integer
,則 Long
的值必須位於 Integer
資料類型的有效範圍內。
警告
如果來源類型不是衍生自目的地類型,則指定 CType
從一個類別類型轉換成另一個類別類型會在執行階段失敗。 這類失敗會擲回 InvalidCastException 例外狀況。
不過,如果其中一個類型是您已定義的結構或類別,且您已在該結構或類別上定義 CType
,則在符合您 CType
需求的情況下,轉換可能會成功。 請參閱操作說明:定義轉換運算子。
執行明確轉換也稱為將運算式「轉換」成指定的資料類型或物件類別。