Partager via


Cast et conversions de types (guide de programmation C#)

Étant donné que C# est typé statiquement au moment de la compilation, une fois qu’une variable est déclarée, elle ne peut pas être déclarée à nouveau ou affectée à une valeur d’un autre type, sauf si ce type est implicitement convertible en type de la variable. Par exemple, il string ne peut pas être converti implicitement en int. Par conséquent, après avoir déclaré i en tant que int, vous ne pouvez pas lui affecter la chaîne « Hello », comme le montre le code suivant :

int i;

// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";

Toutefois, vous devrez peut-être parfois copier une valeur dans une variable ou un paramètre de méthode d’un autre type. Par exemple, vous pouvez avoir une variable entière que vous devez passer à une méthode dont le paramètre est typé comme double. Vous devrez peut-être affecter une variable de classe à une variable d’un type d’interface. Ces types d’opérations sont appelés conversions de types. En C#, vous pouvez effectuer les types de conversions suivants :

  • Conversions implicites : aucune syntaxe spéciale n’est requise, car la conversion réussit toujours et aucune donnée n’est perdue. Par exemple, les conversions de types intégraux plus petits à plus grands, les conversions de classes dérivées en classes de base, et les conversions de portées.

  • Conversions explicites (casts) : les conversions explicites nécessitent une expression cast. Un cast est exigé quand les informations peuvent être perdues durant la conversion, ou quand la conversion peut échouer pour d’autres raisons. Les exemples classiques incluent la conversion numérique vers un type qui a moins de précision ou une plage plus petite, et la conversion d’une instance de classe de base en classe dérivée.

  • Conversions définies par l’utilisateur : les conversions définies par l’utilisateur utilisent des méthodes spéciales que vous pouvez définir pour activer des conversions explicites et implicites entre des types personnalisés qui n’ont pas de relation de classe de base dérivée de classe. Pour plus d’informations, consultez Opérateurs de conversion définie par l’utilisateur.

  • Conversions avec des classes d’assistance : pour effectuer une conversion entre des types non conformes, tels que des entiers et System.DateTime des objets, ou des chaînes hexadécimales et des tableaux d’octets, vous pouvez utiliser la System.BitConverter classe, la System.Convert classe et les Parse méthodes des types numériques intégrés, telles que Int32.Parse. Pour plus d’informations, consultez les articles suivants :

  • Comment convertir un tableau d’octets en int

  • Comment convertir une chaîne en nombre

  • Comment convertir entre des chaînes hexadécimales et des types numériques

Conversions implicites

Pour les types numériques intégrés, une conversion implicite peut être effectuée lorsque la valeur à stocker peut tenir dans la variable sans être tronquée ou arrondie. Pour les types intégraux, cette restriction signifie que la plage du type source est un sous-ensemble approprié de la plage pour le type cible. Par exemple, une variable de type long (entier 64 bits) peut stocker n’importe quelle valeur qu’un entier int (entier 32 bits) peut stocker. Dans l’exemple suivant, le compilateur convertit implicitement la valeur de num sur la droite en type long avant de l’affecter à bigNum.

// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;

Pour obtenir la liste complète de toutes les conversions numériques implicites, consultez la section Conversions numériques implicites de l’article conversions numériques intégrées .

Pour les types de référence, une conversion implicite existe toujours d’une classe vers l’une de ses classes ou interfaces de base directes ou indirectes. Aucune syntaxe spéciale n’est nécessaire, car une classe dérivée contient toujours tous les membres d’une classe de base.

Derived d = new Derived();

// Always OK.
Base b = d;

Conversions explicites

Toutefois, si une conversion ne peut pas être effectuée sans risque de perdre des informations, le compilateur exige que vous effectuez une conversion explicite, appelée cast. Un cast est un moyen explicite d’effectuer la conversion. Il indique que vous êtes conscient que la perte de données peut se produire ou que la conversion peut échouer au moment de l'exécution. Pour effectuer un cast, spécifiez le type de destination entre parenthèses avant l’expression que vous souhaitez convertir. Le programme suivant effectue une conversion explicite d’un double en int. Le programme ne se compile pas sans cette conversion.

double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234

Pour obtenir la liste complète des conversions numériques explicites prises en charge, consultez la section Conversions numériques explicites de l’article Conversions numériques intégrées .

Pour les types de référence, un cast explicite est requis si vous devez effectuer une conversion d’un type de base en type dérivé :

Une opération de cast entre les types de référence ne modifie pas le type d’exécution de l’objet sous-jacent ; elle modifie uniquement le type de la valeur utilisée comme référence à cet objet. Pour plus d’informations, consultez Polymorphisme.

Exceptions de conversion de type au moment de l’exécution

Dans certaines conversions de type référence, le compilateur ne peut pas déterminer si un cast est valide. Il est possible qu’une opération cast dont la compilation fonctionne échoue au moment de l’exécution. Comme l’illustre l’exemple suivant, un cast de type qui échoue au moment de l’exécution provoque la levée d’une exception InvalidCastException.

Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time

Convertir explicitement l’argument a en Reptile est une hypothèse dangereuse. Il est plus sûr de ne pas faire d’hypothèses, mais plutôt de vérifier le type. C# fournit l’opérateur is pour vous permettre de tester la compatibilité avant d’effectuer un cast. Pour plus d’informations, consultez Comment effectuer un cast sécurisé en utilisant la correspondance de modèles et les opérateurs as et is.

Spécification du langage C#

Pour plus d’informations, consultez la section Conversions de la spécification du langage C#.

Voir aussi