Явное преобразование

Обновлен: Ноябрь 2007

Явное преобразование — это способ выполнения преобразования, который зависит от конкретного языка. В некоторых компиляторах для выполнения преобразования, сужающего диапазон значений, требуется использовать явное преобразование.

Хотя большинство языков, ориентированных на среду CLR, поддерживает явное преобразование, конкретные механизмы преобразования в разных языках могут различаться. Некоторые языки, ориентированные на среду CLR, могут требовать выполнения некоторого преобразования в явной форме, в то время как другие языки могут допускать неявное выполнение аналогичного преобразования. Кроме того, некоторые языки могут требовать явного выполнения того или иного преобразования при соблюдении определенных условий (например, когда установлен параметр Option Strict в Visual Basic), но вполне могут допускать неявное выполнение этого преобразования в других условиях (например, когда параметр Option Strict в Visual Basic отключен). Для получения дополнительных сведений о явном преобразовании сверьтесь с документацией по используемому языку.

В некоторых языках, таких как C# и C++, явное преобразование выполняется с помощью приведения типов. Приведение типа осуществляется в том случае, если для преобразования используется префикс с указанием типа данных, задающий тип преобразования, которое нужно выполнить. В других языках, таких как Visual Basic, явное преобразование выполняется путем вызова функции преобразования. В Visual Basic для явного преобразования типов данных, неявное преобразование которых невозможно, используется функция CType или одна из функций преобразования конкретных типов, например CStr или CInt.

Большинство компиляторов допускают явное преобразование как с проверкой, так и без проверки. Если при выполнении преобразования с проверкой преобразуемое значение находится вне диапазона допустимых значений конечного типа, создается исключение OverflowException. Если в такой же ситуации выполнять преобразование без проверки, то, возможно, исключение и не будет создано, но результат преобразования в данном случае неизвестен, и на выходе может быть получено неверное значение.

8s682k58.alert_note(ru-ru,VS.90).gifПримечание.

В 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.

В следующем примере показано явное преобразование с помощью выполняемой с проверкой функции CByte в Visual Basic и приведение типов в 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. Для получения сведений о свойствах явного преобразования обратитесь к документации по используемому языку. Например, при преобразовании значения Double в Int32 в языке Visual Basic c помощью функции CInt происходит округление. Однако если аналогичное явное преобразование выполняется в языке 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

Другие ресурсы

Преобразование типов