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


Операция safe_cast (C++/CLI и C++/CX)

В случае успешного выполнения операция 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
Тип, в который следует преобразовать выражение. Дескриптор ссылки или типа значения, тип значения или отслеживаемая ссылка на ссылку или тип значения.

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

Замечания

safe_cast вызываетсяInvalidCastException, если выражение не может преобразоваться в тип, указанный идентификатором типа. Чтобы поймать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);
   }
}
Caught expected exception: InvalidCastException

Среда CLR

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

Синтаксис

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

Параметры

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

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

Замечания

Выражение 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, and cli Namespaces (C++/CLI and C++/CX) (Пространства имен Platform, default и cli (C++/CLI и C++/CX)).

Дополнительные сведения о safe_cast см. в следующих статьях.

Требования

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

Примеры

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

См. также

Расширения компонентов для .NET и UWP