Расширяющие и сужающие преобразования (Visual Basic)
Важной характеристикой при преобразовании типа является получение результата преобразования в пределах диапазона конечного типа данных.
A расширяющее преобразование изменяет значение на тип данных, который может допускать любое возможное значение исходных данных.Расширяющие преобразования сохраняют исходное значение, но могут изменить его представление.Это происходит при преобразовании из объединенного типа Decimalили Char В String.
Сужающее преобразование изменяет значение на тип данных, который не может содержать некоторые из возможных значений.Например, частичное значение округляется, когда оно преобразуется к целочисленному типу, преобразованным в тип, и numeric Boolean уменьшает к этому True OR False.
Расширяющие преобразования
В приведенной ниже таблице показаны стандартные расширяющие преобразования.
Тип данных |
Расширяется до типов данных 1 |
SByte, Short, Integer, Long, Decimal, Single, Double |
|
Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double |
|
Short, Integer, Long, Decimal, Single, Double |
|
UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double |
|
Integer, Long, Decimal, Single, Double2 |
|
UInteger, Long, ULong, Decimal, Single, Double2 |
|
Long, Decimal, Single, Double2 |
|
ULong, Decimal, Single, Double2 |
|
Decimal, Single, Double2 |
|
Single, Double |
|
Double |
|
Какой-либо перечисляемый тип (Enum) |
Базовый тип и любые его целочисленный тип, в который расширяет базовый тип. |
Char, String |
|
Массив Char |
Массив Char, String |
Любой тип |
|
Любой производный тип |
Любой базовый тип, от которого он является производным 3. |
Любой тип |
Любой реализуемый интерфейс. |
Любой тип данных или тип объекта. |
1 По определению каждый тип данных может быть расширен до самого себя.
2 Преобразования из Integer, UInteger, Long, ULong или Decimal в Single или Double могут привести к потере точности, но никогда не приведут к потере величины.В этом смысле такие преобразования не приводят к потере информации.
3 Может показаться странным, что преобразование из производного типа в один из базовых типов является расширяющим.Объясняется это тем, что производный тип содержит все члены базового типа, поэтому он определяется как экземпляр базового типа.С другой стороны, базовый тип не содержит каких-либо новых членов, определенных производным типом.
Расширяющие преобразования всегда успешны во время выполнения и никогда не приводят к потере данных.Можно всегда выполнить их неявным образом, независимо от того, задан ли в Оператор Option Strict ключ проверки типа со значением On или Off.
Сужающие преобразования
Стандартные сужающие преобразования включают следующие:
Обратные направления расширяющих преобразований в предшествующей таблице (за исключением того, что каждый тип может быть расширен до самого себя).
Преобразования в любом направлении между типом Boolean и любым числовым типом.
Преобразования любого числового типа в любой перечисляемый тип (Enum).
Преобразования в любом направлении между типом String и любым числовым типом, типом Boolean или Date.
Преобразования типа данных или типа объекта в их производный тип.
Сужающие преобразования не всегда успешны во время выполнения и могут привести к ошибке или потере данных.Ошибка появляется, если конечному типу данных не удается получить преобразованное значение.Например, числовое преобразование может привести к переполнению.Компилятор не позволяет выполнять сужающие преобразования неявным образом, если только в Оператор Option Strict не задается ключ проверки типа со значением Off.
Примечание |
---|
Ошибка сужающего преобразования отбрасывается при преобразовании элементов коллекции For Each…Next в переменную цикла.Дополнительные сведения и примеры см. в подразделе "Сужающие преобразования" Оператор For Each... Next (Visual Basic). |
Ситуации, в которых используются сужающие преобразования
Сужающее преобразование следует использовать, когда известно, что исходное значение может быть преобразовано в конечный тип данных без ошибки и потери данных.Например, если имеется a String что известно, содержащий или "true" или "false", можно использовать CBool ключевое слово, которое требуется преобразовать его в Boolean.
Исключения при преобразовании
Поскольку расширяющие преобразования всегда выполняются успешно, они не вызывают исключений.Неудачно выполненные сужающие преобразования часто создают следующие исключения:
InvalidCastException — если не определено преобразование между двумя типами.
OverflowException — (только для целых типов) если преобразованное значение слишком велико для конечного типа.
Если класс или структура определяет Функция CType (Visual Basic) в качестве оператора преобразования в структуру или класс либо из структуры или класса, где 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)
Функции преобразования типов (Visual Basic)
Основные понятия
Явные и неявные преобразования (Visual Basic)
Преобразование значений между строковыми и другими типами (Visual Basic)
Преобразование массивов (Visual Basic)