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


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

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

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

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

Синтаксис

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

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

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

Синтаксис

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

Параметры

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

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

Примечания

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

Требования

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

Примеры

Пример

В следующем примере кода демонстрируется использование 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);
   }
}

Output

  

Среда CLR

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

Синтаксис

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

Параметры

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

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

Примечания

Выражение 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 см. в разделах:

Требования

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

Примеры

Пример

Одним из примеров, где компилятор не принимает 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");
   }
}

Output

  

См. также

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

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