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 см. в разделах:
Приведение в стиле C с использованием параметра /clr (C++/CLI)
Как Используйте 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