safe_cast
L'opération safe_cast retourne l'expression spécifiée comme type spécifié, en cas de succès ; sinon, lève l'exception InvalidCastException.
Tous les runtimes
(Aucune note de 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 cas où vous vous attendez pleinement à ce qu'une variable ou un paramètre soit convertible en un certain type, vous pouvez utiliser safe_cast sans le bloc try-catch pour détecter des erreurs de programmation lors du développement. Pour plus d'informations, consultez Casting (C++/CX).
Syntaxe
[default]::safe_cast<type-id>(expression)
Paramètres
type-id
Type dans lequel convertir expression. Handle pour une référence ou un type valeur, un type valeur, ou une référence de suivi pour une référence ou un type valeur.expression
Expression qui correspond à un handle vers une référence ou vers un type valeur, un type valeur ou une référence de suivi vers une référence ou un type valeur.
Remarques
safe_cast lève InvalidCastException s'il est impossible de convertir expression au type spécifié par type-id. Pour intercepter InvalidCastException, spécifiez l'option du compilateur /EH (Modèle de gestion des exceptions) et utilisez une instruction try/catch.
Conditions requises
Option du compilateur : /ZW
Exemples
Exemple
L'exemple de code suivant illustre l'utilisation de 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);
}
}
Sortie
Common Language Runtime
safe_cast vous permet de modifier le type d'une expression et générer le code MSIL vérifiable.
Syntaxe
[cli]::safe_cast<type-id>(expression)
Paramètres
type-id
Handle pour une référence ou un type valeur, un type valeur, ou une référence de suivi pour une référence ou un type valeur.expression
Expression qui correspond à un handle vers une référence ou vers un type valeur, un type valeur ou une référence de suivi vers une référence ou un type valeur.
Remarques
L'expression safe_cast<type-id>(expressionexpression) convertit l'expression d'opérande en objet de type type identificateur.
Le compilateur acceptera un static_cast à la plupart des endroits où il acceptera un safe_cast. Toutefois, il est garanti que safe_cast produise un code MSIL vérifiable, alors que static_cast peut produire un code MSIL non vérifiable. Pour plus d'informations sur le code vérifiable, consultez Code pur et vérifiable (C++/CLI) et Peverify.exe (outil PEVerify).
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 un const_cast (modifiez le cast const).
safe_cast est dans l'espace de noms cli. Pour plus d'informations, consultez l'espace de noms de CLI.
Pour plus d'informations sur safe_cast, consultez :
Conditions requises
Option du compilateur : /clr
Exemples
Exemple
Un exemple d'emplacement où le compilateur ne recevra pas un static_cast mais recevra un safe_cast est pour les casts entre les types d'interface non liés. Avec safe_cast, le compilateur n'émet pas d'erreur de conversion et effectue un contrôle au moment de l'exécution pour voir 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");
}
}
Sortie