Операция 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