共用方式為


明確轉換

更新:2007 年 11 月

明確轉換是一種與語言相關的執行轉換方式。有些編譯器會要求進行明確轉換,才能支援縮小轉換。

雖然大多數以 Common Language Runtime 為目標的語言都支援明確轉換,但是實際使用的機制則會因語言而不同。有些以 Common Language Runtime 為目標的語言可能會要求特定轉換必須以明確方式執行,而其他的語言則允許相同的轉換以隱含方式執行。同樣地,有些語言可能會要求特定轉換在某些情況下必須以明確方式執行 (例如,如果 Option Strict 在 Visual Basic 中設定為 On),但在某些情況下會以隱含方式執行轉換 (例如,如果 Option Strict 在 Visual Basic 中設定為 Off)。如需了解明確轉換的詳細資訊,請參閱所使用語言的文件。

在某些語言 (例如 C# 和 C++) 中,明確轉換是使用轉型來執行的。當您在轉換前加上定義要執行的轉換型別的資料型別時,便會發生轉型。在其他語言 (例如 Visual Basic) 中,明確轉換則是以呼叫轉換函式的方式執行的。在 Visual Basic 中,使用 CType 函式或特定型別轉換函式 (如 CStr 或 CInt) 可允許不能以隱含方式執行的資料型別明確轉換。

大多數的編譯器都允許明確轉換以已檢查或未檢查的方式執行。如果執行已檢查的轉換,當轉換型別的值不在目標型別的範圍內時,會擲回 OverflowException。在同樣的狀況下執行未檢查的轉換時,轉換的值可能不會引發例外狀況,但是實際的行為會變成未定義,而且可能產生不正確的值。

注意事項:

在 C# 中,已檢查的轉換可使用 checked 關鍵字搭配轉型運算子來執行,或可以指定 /checked+ 編譯器選項來執行。相反地,未檢查的轉換可使用 unchecked 關鍵字搭配轉型運算子來執行,或可以指定 /checked- 編譯器選項來執行。根據預設,明確轉換是未檢查的。在 Visual Basic 中,已檢查的轉換可藉由清除專案的 [進階編譯器設定] 對話方塊中的 [移除整數的溢位檢查] 核取方塊來執行,或可以指定 /removeintchecks- 編譯器選項來執行。相反地,未檢查的轉換可以藉由選取專案的 [進階編譯器設定] 對話方塊中的 [移除整數的溢位檢查] 核取方塊來執行,或可以指定 /removeintchecks+ 編譯器選項來執行。根據預設,明確轉換是檢查的。

下列範例嘗試將 Int32.MaxValue 轉換為 Byte 值,以示範未檢查的 C# 轉型。請注意,雖然整數值超出目標 Byte 資料型別的範圍,轉換不會擲回 OverflowException

// The integer value is set to 2147483647.
int myInt = int.MaxValue;
try
{
   byte myByte = (byte)myInt;
   Console.WriteLine("The byte value is {0}.", myByte);
}
catch (OverflowException)
{
   Console.WriteLine("Unable to convert {0} to a byte.", myInt);
}   
// The value of MyByte is 255, the maximum value of a Byte.
// No overflow exception is thrown.

下列範例說明在 Visual Basic 中使用已檢查的 CByte 函式以及在 C# 中使用 checked 關鍵字的已檢查轉型的明確轉換。這個範例會嘗試將 Int32.MaxValue 轉換成 Byte 值。不過,由於 Int32.MaxValue 超出 Byte 資料型別的範圍,會擲回 OverflowException

' The integer value is set to 2147483647.
Dim myInt As Integer = Integer.MaxValue
Try
   Dim myByte As Byte = CByte(myInt)
   Console.WriteLine("The byte value is {0}.", myByte)
Catch e As OverflowException
   Console.WriteLine("Unable to convert {0} to a byte.", myInt)
End Try   
' Attempting to convert Int32.MaxValue to a Byte 
' throws an OverflowException.
// The integer value is set to 2147483647.
int myInt = int.MaxValue;
try
{
   byte myByte = checked ((byte) myInt);
   Console.WriteLine("The byte value is {0}.", myByte);
}
catch (OverflowException)
{
   Console.WriteLine("Unable to convert {0} to a byte.", myInt);
}   
// Attempting to convert Int32.MaxValue to a Byte 
// throws an OverflowException.

請注意,明確轉換在不同的語言中可能會產生不同的結果,這些結果可能與對應的 Convert 方法的行為不同。如需明確轉換行為的詳細資訊,請參考所使用語言的文件。例如,在 Visual Basic 中使用 CInt 函式將 Double 值轉換成 Int32 值時,會執行四捨五入處理。但是,在 C# 中使用明確轉換執行相同的轉換時,小數點右邊的值會不見。下列程式碼範例會使用明確轉換,將雙精度浮點數 (Double) 值轉換成整數值。

Dim myDouble As Double = 42.72
Dim myInt As Integer = CInt(myDouble)
Console.WriteLine(myInt)
' myInt has a value of 43.
Double myDouble = 42.72;
int myInt = checked ((int)myDouble);
Console.WriteLine(myInt);
// myInt has a value of 42.

請參閱

參考

System.Convert

其他資源

轉換型別