Расширяющие и сужающие преобразования
Обновлен: Июль 2008
Важной характеристикой при преобразовании типа является получение результата преобразования в пределах диапазона конечного типа данных. Расширяющее преобразование изменяет значение на тип данных, который может принимать любое возможное значение исходных данных. Сужающее преобразование изменяет значение на тип данных, который не может содержать некоторые из возможных значений.
Расширяющие преобразования
В приведенной ниже таблице показаны стандартные расширяющие преобразования.
Тип данных |
Расширяется до типов данных 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). |
Ситуации, в которых используются сужающие преобразования
Сужающее преобразование следует использовать, когда известно, что исходное значение может быть преобразовано в конечный тип данных без ошибки и потери данных. Например, если имеется тип String, о котором известно, что он содержит значение "True" или "False", то можно использовать ключевое слово CBool для преобразования его в тип Boolean.
Исключения при преобразовании
Поскольку расширяющие преобразования всегда выполняются успешно, они не вызывают исключений. Неудачно выполненные сужающие преобразования часто создают следующие исключения:
InvalidCastException — если не определено преобразование между двумя типами.
OverflowException — (только для целых типов) если преобразованное значение слишком велико для конечного типа.
Если класс или структура определяет Функция CType в качестве оператора преобразования в структуру или класс либо из структуры или класса, где CType может вызвать какое-либо исключение, то он рассматривается соответствующим образом. Кроме того, CType может вызвать функции Visual Basic или методы .NET Framework, которые, в свою очередь, могут вызвать ряд исключений.
См. также
Задачи
Практическое руководство. Преобразование объекта к другому типу в Visual Basic
Основные понятия
Явные и неявные преобразования
Изменение значений в процессе преобразований
Преобразование значений между строковыми и другими типами
Программирование без типов в Visual Basic
Ссылки
Сводка типов данных (Visual Basic)
Другие ресурсы
Преобразование типов в Visual Basic
Журнал изменений
Дата |
Журнал изменений |
Причина |
---|---|---|
Июль 2008 |
Добавлена заметка о сужающих преобразованиях и For Each…Next. |
Обратная связь от клиента. |