Partager via


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

  

Voir aussi

Concepts

Fonctionnalités de langage pour cibler le CLR