Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Операция safe_cast возвращает указанное выражение в качестве указанного типа. Если операция не выполнена, она создает исключение InvalidCastException.
All Runtimes
(Отсутствуют комментарии для этой возможности языка, которая применяется во всех средах выполнения.)
Syntax
[default]:: safe_cast< type-id >( expression )
Windows Runtime
Используется safe_cast для изменения типа указанного выражения. If you expect a variable or parameter to be convertible to a certain type, use safe_cast without a try-catch block to detect programming errors during development. For more information, see Casting (C++/CX).
Syntax
[default]:: safe_cast< type-id >( expression )
Parameters
type-id
The type to convert expression to. Дескриптор ссылки или типа значения, тип значения или отслеживаемая ссылка на ссылку или тип значения.
expression
Выражение, которое оценивается в дескрипторе ссылки или типа значения, типе значения или отслеживаемой ссылке на ссылку или тип значения.
Remarks
safe_cast throws InvalidCastException if it can't convert expression to the type specified by type-id. To catch InvalidCastException, specify the /EH (Exception Handling Model) compiler option, and use a try/catch statement.
Requirements
Параметр компилятора: /ZW
Examples
В следующем примере кода показано, как использовать 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.
Syntax
[cli]:: safe_cast< type-id >( expression )
Parameters
type-id
Дескриптор ссылки или типа значения, тип значения или отслеживаемая ссылка на ссылку или тип значения.
expression Выражение, которое вычисляет дескриптор для ссылочного или типа значений, типа значения или ссылки отслеживания на тип ссылки или значения.
Remarks
The expression safe_cast<type-id>(expression) converts the operand expression to an object of type type-id.
Компилятор принимает в static_cast большинстве мест, которые он принимает safe_cast.
safe_cast Однако всегда создается проверяемая MSIL, в то время как static_cast может производиться неотверяемая MSIL. Дополнительные сведения о проверяемом коде см. в статьях Pure and Verifiable Code (C++/CLI) иPeverify.exe (PEVerify Tool).
Например static_cast, safe_cast вызывает определяемые пользователем преобразования.
For more information about casts, see Casting Operators.
safe_cast не применяется const_cast (отбрасывается const).
safe_cast находится в пространстве имен cli. Дополнительные сведения см. в разделе "Платформа", "Пространства имен по умолчанию" и "Cli".
Дополнительные сведения см. в safe_castследующем разделе:
- Приведение в стиле C с использованием параметра /clr (C++/CLI)
- Практическое руководство. Использование safe_cast в C++/CLI
Requirements
Параметр компилятора: /clr
Examples
Один из примеров того, где компилятор не принимает, 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");
}
}
Caught expected exception