safe_cast (C++/CLI a C++/CX)
Operace safe_cast vrátí zadaný výraz jako zadaný typ, pokud je úspěšný; v opačném případě vyvolá InvalidCastException
.
Všechny moduly runtime
(Pro tuto funkci jazyka neexistují žádné poznámky, které platí pro všechny moduly runtime.)
Syntaxe
[default]:: safe_cast< type-id >( expression )
prostředí Windows Runtime
safe_cast umožňuje změnit typ zadaného výrazu. V situacích, kdy plně očekáváte, že se proměnná nebo parametr převést na určitý typ, můžete použít safe_cast bez bloku try-catch k detekci programovacích chyb během vývoje. Další informace naleznete v tématu Přetypování (C++/CX).
Syntaxe
[default]:: safe_cast< type-id >( expression )
Parametry
ID typu
Typ, na který se má výraz převést. Popisovač odkazu nebo typu hodnoty, typu hodnoty nebo sledovacího odkazu na odkaz nebo typ hodnoty.
výraz
Výraz, který se vyhodnotí jako popisovač pro odkaz nebo typ hodnoty, typ hodnoty nebo sledovací odkaz na odkaz nebo typ hodnoty.
Poznámky
safe_cast vyvolá, InvalidCastException
pokud nemůže převést výraz na typ zadaný podle id typu. Chcete-li zachytit InvalidCastException
, zadejte možnost kompilátoru /EH (Exception Handling Model) a použijte příkaz try/catch.
Požadavky
Možnost kompilátoru: /ZW
Příklady
Následující příklad kódu ukazuje použití safe_cast s prostředí Windows Runtime.
// 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 (Common Language Runtime)
safe_cast umožňuje změnit typ výrazu a vygenerovat ověřitelný kód MSIL.
Syntaxe
[cli]:: safe_cast< type-id >( expression )
Parametry
ID typu
Popisovač odkazu nebo typu hodnoty, typu hodnoty nebo sledovacího odkazu na odkaz nebo typ hodnoty.
výraz
Výraz, který se vyhodnotí jako popisovač pro odkaz nebo typ hodnoty, typ hodnoty nebo sledovací odkaz na odkaz nebo typ hodnoty.
Poznámky
Výraz safe_cast<
type-id>(
výrazu)
převede výraz operand na objekt typu id.
Kompilátor přijme static_cast na většině míst, kde přijme safe_cast. Je však zaručeno, že safe_cast vytvořit ověřitelný jazyk MSIL, zatímco by mohl vést k neověřitelnému static_cast
jazyku MSIL. Další informace o ověřitelném kódu najdete v tématu Čistý a ověřitelný kód (C++/CLI) a Peverify.exe (nástroj PEVerify).
Podobně jako static_cast
safe_cast vyvolá uživatelem definované převody.
Další informace o přetypování naleznete v tématu Operátory přetypování.
safe_cast nepoužije const_cast
(odlitekconst
).
safe_cast je v oboru názvů rozhraní příkazového řádku. Další informace najdete v tématu Obory názvů platformy, výchozího nastavení a rozhraní příkazového řádku.
Další informace o safe_cast najdete tady:
Požadavky
Možnost kompilátoru: /clr
Příklady
Jedním z příkladů, kdy kompilátor nepřijme, static_cast
ale přijme safe_cast , je přetypování mezi nesouvisejícími typy rozhraní. V safe_cast kompilátor nevystaví chybu převodu a provede kontrolu za běhu, aby zjistil, jestli je možné přetypování.
// 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