Поделиться через


Расширяющие и сужающие преобразования

Обновлен: Июль 2008

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

Расширяющие преобразования

В приведенной ниже таблице показаны стандартные расширяющие преобразования.

Тип данных

Расширяется до типов данных 1

SByte

SByte, Short, Integer, Long, Decimal, Single, Double

Byte

Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double

Short

Short, Integer, Long, Decimal, Single, Double

UShort

UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double

Integer

Integer, Long, Decimal, Single, Double2

UInteger

UInteger, Long, ULong, Decimal, Single, Double2

Long

Long, Decimal, Single, Double2

ULong

ULong, Decimal, Single, Double2

Decimal

Decimal, Single, Double2

Single

Single, Double

Double

Double

Какой-либо перечисляемый тип (Enum)

Лежащий в его основе целый тип и любой тип, до которого он расширяется

Char

Char, String

Массив Char

Массив Char, String

Любой тип

Объект

Любой производный тип

Любой базовый тип, от которого произведено 3

Любой тип

Любой реализуемый интерфейс

Nothing

Любой тип данных или тип объекта

1 По определению каждый тип данных может быть расширен до самого себя.

2 Преобразования из Integer, UInteger, Long, ULong или Decimal в Single или Double могут привести к потере точности, но никогда не приведут к потере величины. В этом смысле такие преобразования не приводят к потере информации.

3 Может показаться странным, что преобразование из производного типа в один из базовых типов является расширяющим. Объясняется это тем, что производный тип содержит все члены базового типа, поэтому он определяется как экземпляр базового типа. С другой стороны, базовый тип не содержит каких-либо новых членов, определенных производным типом.

Расширяющие преобразования всегда успешны во время выполнения и никогда не приводят к потере данных. Можно всегда выполнить их неявным образом, независимо от того, задан ли в Оператор Option Strict ключ проверки типа со значением On или Off.

Сужающие преобразования

Стандартные сужающие преобразования включают следующие:

  • Обратные направления расширяющих преобразований в предшествующей таблице (за исключением того, что каждый тип может быть расширен до самого себя).

  • Преобразования в любом направлении между типом Boolean и любым числовым типом.

  • Преобразования любого числового типа в любой перечисляемый тип (Enum).

  • Преобразования в любом направлении между типом String и любым числовым типом, типом Boolean или Date.

  • Преобразования типа данных или типа объекта в их производный тип.

Сужающие преобразования не всегда успешны во время выполнения и могут привести к ошибке или потере данных. Ошибка появляется, если конечному типу данных не удается получить преобразованное значение. Например, числовое преобразование может привести к переполнению. Компилятор не позволяет выполнять сужающие преобразования неявным образом, если только в Оператор Option Strict не задается ключ проверки типа со значением Off.

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

Ошибка сужающего преобразования отбрасывается при преобразовании элементов коллекции 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)

Функции преобразования типов

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

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

Журнал изменений

Дата

Журнал изменений

Причина

Июль 2008

Добавлена заметка о сужающих преобразованиях и For Each…Next.

Обратная связь от клиента.