分享方式:


隱含和明確轉換 (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 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、StringObject
CByte Byte 資料類型 任何數值類型 (包括 SByte 和列舉類型)、BooleanStringObject
CChar Char 資料類型 StringObject
CDate Date 資料類型 StringObject
CDbl Double 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、BooleanStringObject
CDec Decimal 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、BooleanStringObject
CInt Integer 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、BooleanStringObject
CLng Long 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、BooleanStringObject
CObj Object Data Type 任何型別
CSByte SByte 資料類型 任何數值類型 (包括 Byte 和列舉類型)、BooleanStringObject
CShort Short 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、BooleanStringObject
CSng Single 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、BooleanStringObject
CStr String 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、BooleanCharChar 陣列、DateObject
CType 接在逗號 (,) 後面指定的類型 轉換成「基礎資料型別」(Elementary Data Type) 時 (包括基礎型別的陣列),則為對應轉換關鍵字所允許的相同類型

轉換成「複合資料型別」時,則為其所實作介面及其繼承的來源類別

轉換成您已多載 CType 的類別或結構時,則為該類別或結構
CUInt UInteger 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、BooleanStringObject
CULng ULong 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、BooleanStringObject
CUShort UShort 資料類型 任何數值類型 (包括 ByteSByte 和列舉類型)、BooleanStringObject

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 需求的情況下,轉換可能會成功。 請參閱操作說明:定義轉換運算子

執行明確轉換也稱為將運算式「轉換」成指定的資料類型或物件類別。

另請參閱