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


safe_cast (расширения компонентов C++)

Операция safe_cast в случае успешного выполнения возвращает указанное выражение как указанный тип; в противном случае возникает исключение InvalidCastException.

Все среды выполнения

(Отсутствует комментарий для этой функции языка, которая применяется ко всем средам выполнения).

23b7yy6w.collapse_all(ru-ru,VS.110).gifСинтаксис

[default]::safe_cast<type-id>(expression)

Среда выполнения Windows

safe_cast позволяет изменять тип указанного выражения.В ситуациях, когда необходимо, чтобы переменная или параметр полностью преобразовывались к определенному типу, можно использовать safe_cast без блока try-catch для выявления ошибок программирования в ходе разработки.Дополнительные сведения см. в разделах Приведение (C++/CX).

23b7yy6w.collapse_all(ru-ru,VS.110).gifСинтаксис

[default]::safe_cast<type-id>(expression)

23b7yy6w.collapse_all(ru-ru,VS.110).gifПараметры

  • type-id
    Тип, в который преобразуется expression.Дескриптор ссылки или типа значения, тип значения или ссылка с отслеживанием на ссылку или тип значения.

  • expression
    Выражение, оценивающее как дескриптор ссылки или типа значения, тип значения или ссылка с отслеживанием на ссылку или тип значения.

23b7yy6w.collapse_all(ru-ru,VS.110).gifЗаметки

safe_cast создает исключение InvalidCastException, если не удается преобразовать expression к типу, указанному в type-id.Для перехвата InvalidCastException укажите параметр компилятора Параметр /EH (модель обработки исключений) и воспользуйтесь оператором try/catch.

23b7yy6w.collapse_all(ru-ru,VS.110).gifТребования

Параметр компилятора: /ZW

23b7yy6w.collapse_all(ru-ru,VS.110).gifПримеры

Пример

В следующем примере кода демонстрируется использование safe_cast с Среда выполнения Windows.

// safe_cast_ZW.cpp
// compile with: /ZW /EHsc

using namespace default;
using namespace Platform;

interface class I1 {};
interface class I2 {};
interface class I3 {};

ref class X : public I1, public I2 {};

int main(Array<String^>^ args) {
   I1^ i1 = ref new X;
   I2^ i2 = safe_cast<I2^>(i1);   // OK, I1 and I2 have common type: X
   // I2^ i3 = static_cast<I2^>(i1);   C2440 use safe_cast instead
   try {
      I3^ i4 = safe_cast<I3^>(i1);   // Fails because i1 is not derived from I3.
   } 
   catch(InvalidCastException^ ic) {
     wprintf(L"Caught expected exception: %s\n", ic->Message);
   }
}

Вывод

  

Среда CLR

safe_cast позволяет изменять тип выражения и создавать проверяемый код MSIL.

23b7yy6w.collapse_all(ru-ru,VS.110).gifСинтаксис

[cli]::safe_cast<type-id>(expression)

23b7yy6w.collapse_all(ru-ru,VS.110).gifПараметры

  • type-id
    Дескриптор ссылки или типа значения, тип значения или ссылка с отслеживанием на ссылку или тип значения.

  • expression
    Выражение, оценивающее как дескриптор ссылки или типа значения, тип значения или ссылка с отслеживанием на ссылку или тип значения.

23b7yy6w.collapse_all(ru-ru,VS.110).gifЗаметки

Выражение safe_cast<type-id>(expression) преобразует выражение операнда к объекту типа type-id.

Компилятор примет static_cast в большинстве мест, в которых он принимает safe_cast.Тем не менее, гарантируется, что safe_cast создает проверяемый MSIL, где в качестве static_cast может создаваться непроверяемый MSIL.См. разделы Чистый и проверяемый код (C++/CLI) и Peverify.exe (средство PEVerify) для дополнительной информации по проверяемому коду.

Как и static_cast, safe_cast вызывает определенное пользователем преобразование.

Дополнительные сведения о преобразованиях см. в разделе Операторы приведения.

safe_cast не применяет const_cast (снятие const).

safe_cast в пространстве имен CLI.Дополнительные сведения см. в разделе Пространства имен platform, default и cli (расширения компонентов C++).

Дополнительные сведения по safe_cast см. в разделах:

23b7yy6w.collapse_all(ru-ru,VS.110).gifТребования

Параметр компилятора: /clr

23b7yy6w.collapse_all(ru-ru,VS.110).gifПримеры

Пример

Одним из примеров, где компилятор не принимает static_cast, но принимает safe_cast, для преобразований между несвязными типами интерфейса.При работе с safe_cast компилятор не выдаст ошибку преобразования и выполнит проверку во время выполнения, чтобы проверить, возможно ли приведение.

// safe_cast.cpp
// compile with: /clr
using namespace System;

interface class I1 {};
interface class I2 {};
interface class I3 {};

ref class X : public I1, public I2 {};

int main() {
   I1^ i1 = gcnew X;
   I2^ i2 = safe_cast<I2^>(i1);   // OK, I1 and I2 have common type: X
   // I2^ i3 = static_cast<I2^>(i1);   C2440 use safe_cast instead
   try {
      I3^ i4 = safe_cast<I3^>(i1);   // fail at runtime, no common type
   } 
   catch(InvalidCastException^) {
      Console::WriteLine("Caught expected exception");
   }
}

Вывод

  

См. также

Основные понятия

Расширения компонентов для платформ среды выполнения