safe_cast (C++/CLI et C++/CX)
L’opération safe_cast retourne l’expression spécifiée en tant que type spécifié, en cas de réussite ; sinon, lève une exception InvalidCastException
.
Tous les runtimes
(Aucune remarque pour cette fonctionnalité de langage ne s’applique à tous les runtimes.)
Syntaxe
[default]:: safe_cast< type-id >( expression )
Windows Runtime
safe_cast vous permet de modifier le type d’une expression spécifiée. Dans les situations où vous vous attendez à ce qu’une variable ou un paramètre soit convertible en un certain type, vous pouvez utiliser safe_cast sans bloc try-catch pour détecter les erreurs de programmation pendant le développement. Pour plus d’informations, consultez Cast (C++/CX).
Syntaxe
[default]:: safe_cast< type-id >( expression )
Paramètres
type-id
Type vers lequel convertir une expression. Handle vers un type référence ou valeur, type valeur ou référence de suivi à un type référence ou valeur.
expression
Expression qui s'évalue en handle vers un type référence ou type valeur, type valeur ou référence de suivi vers un type référence ou valeur.
Notes
safe_cast lève si InvalidCastException
elle ne peut pas convertir l’expression en type spécifié par type-id. Pour intercepterInvalidCastException
, spécifiez l’option du compilateur /EH (Modèle de gestion des exceptions) et utilisez une instruction try/catch.
Spécifications
Option du compilateur : /ZW
Exemples
L’exemple de code suivant présente comment utiliser safe_cast avec 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
Common Language Runtime
safe_cast vous permet de modifier le type d’une expression et de générer du code MSIL vérifiable.
Syntaxe
[cli]:: safe_cast< type-id >( expression )
Paramètres
type-id
Handle vers un type référence ou valeur, type valeur ou référence de suivi à un type référence ou valeur.
expression
Expression qui s'évalue en handle vers un type référence ou type valeur, type valeur ou référence de suivi vers un type référence ou valeur.
Notes
L’expression safe_cast<
type-id>(
expression)
convertit l’expression d’opérande en objet de type type-id.
Le compilateur accepte un static_cast à la plupart des emplacements auxquels il accepte un safe_cast. Toutefois, safe_cast est garantie de produire un MSIL vérifiable, alors qu’un MSIL peut produire un static_cast
MSIL inverifiable. Voir Code pur et vérifiable (C++/CLI) et Peverify.exe (Outil PEVerify) pour plus d’informations sur le code vérifiable.
Comme static_cast
, safe_cast appelle des conversions définies par l’utilisateur.
Pour plus d’informations sur les casts, consultez Opérateurs de casting.
safe_cast n’applique pas de const_cast
(casterconst
).
safe_cast est dans l’espace de noms cli. Consultez Plateforme, valeurs par défaut et espaces de noms CLI pour plus d’informations.
Pour plus d’informations sur safe_cast, consultez :
Spécifications
Option du compilateur : /clr
Exemples
L’un des exemples où le compilateur n’acceptera pas un static_cast
, mais acceptera un safe_cast est destiné aux casts entre les types d’interface non liés. Avec safe_cast, le compilateur n’émet pas d’erreur de conversion et effectue une vérification au moment de l’exécution si le cast est possible.
// 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