6. Conversions
Une conversion de type est effectuée quand une valeur d’un type est utilisée dans un contexte qui nécessite un type différent. Si une telle conversion se produit automatiquement, on parle de conversion implicite. Un exemple couramment cité est celui de certains opérateurs qui doivent convertir une ou plusieurs des valeurs désignées par leurs opérandes. La conversion implicite est autorisée, à condition que le sens de la valeur source soit préservé (par exemple, aucune perte de précision d’un nombre lorsqu’il est converti).
L’opérateur cast (§7.2.9) permet une conversion explicite.
Les conversions sont décrites ci-dessous, des informations supplémentaires étant fournies si nécessaire dans la description de chaque opérateur à la section §6.19.
La conversion explicite d’une valeur en un type qui est déjà le sien n’entraîne aucune modification de cette valeur ou de sa représentation.
Les règles de traitement des conversions quand la valeur d’une expression est liée à un paramètre sont couvertes dans la section §6.17.
6.1 Conversion en void
Vous pouvez ignorer explicitement une valeur de n’importe quel type en la castant en type void. Il n’y a aucun résultat.
6.2 Conversion en bool
Les règles de conversion d’une valeur en type bool sont les suivantes :
- Une valeur numérique ou char égale à zéro est convertie en False ; une valeur numérique ou char différente de zéro est convertie en True.
- Une valeur de type null est convertie en False.
- Une chaîne de longueur 0 est convertie en False ; une chaîne de longueur > 0 est convertie en True.
- Un paramètre switch avec la valeur
$true
est converti en True, et un paramètre switch avec la valeur$false
est converti en False. - Toutes les autres valeurs de type référence non-null sont converties en True.
Si le type implémente IList :
- Si Length > 2 pour l’objet, la valeur est convertie en True.
- Si Length = 1 pour l’objet et que le premier élément n’est pas un IList, alors si la valeur de cet élément est true, la valeur est convertie en True.
- Sinon, si Count >= 1 pour le premier l’élément, la valeur est convertie en True.
- Sinon, la valeur est convertie en False.
6.3 Conversion en char
Les règles de conversion d’une valeur en type char sont les suivantes :
- La conversion d’une valeur de type bool, decimal, float ou double est erronée.
- Une valeur de type null est convertie en caractère null (U+0000).
- Une valeur de type integer dont la valeur peut être représentée dans le type char a cette valeur ; sinon, la conversion est erronée.
- La conversion d’une valeur string dont la longueur est différente de 1 est erronée.
- Une valeur string d’une longueur de 1 est convertie en char ayant la valeur de ce caractère.
- Une valeur de type numérique dont la valeur après arrondi de toute partie fractionnaire peut être représentée dans le type de destination a cette valeur arrondie ; sinon, la conversion est erronée.
- Pour les autres valeurs de type référence, si le type référence prend en charge une telle conversion, cette conversion est utilisée ; sinon, la conversion est erronée.
6.4 Conversion en integer
Les règles de conversion d’une valeur en type byte, int ou long sont les suivantes :
- La valeur bool False est convertie en zéro ; la valeur bool True est convertie en 1.
- Une valeur de type char dont la valeur peut être représentée dans le type de destination a cette valeur ; sinon, la conversion est erronée.
- Une valeur de type numérique dont la valeur après arrondi de toute partie fractionnaire peut être représentée dans le type de destination a cette valeur arrondie ; sinon, la conversion est erronée.
- Une valeur de type null est convertie en zéro.
- Une chaîne qui représente un nombre est convertie selon les règles décrites à la section §6.16. Si, après troncation de la partie fractionnaire, le résultat peut être représenté dans le type de destination, la chaîne est bien formée et a le type de destination ; sinon, la conversion est erronée. Si la chaîne ne représente pas un nombre, la conversion est erronée.
- Pour les autres valeurs de type référence, si le type référence prend en charge une telle conversion, cette conversion est utilisée ; sinon, la conversion est erronée.
6.5 Conversion en float et double
Les règles de conversion d’une valeur en type float ou double sont les suivantes :
- La valeur bool False est convertie en zéro ; la valeur bool True est convertie en 1.
- Une valeur char est représentée exactement.
- Une valeur de type numérique est représentée exactement, si possible ; toutefois, pour les conversions de valeurs int, long et decimal en float, et pour les conversions de valeurs long et decimal en double, une partie des bits les moins significatifs de la valeur entière peut être perdue.
- Une valeur de type null est convertie en zéro.
- Une chaîne qui représente un nombre est convertie selon les règles décrites à la section §6.16 ; sinon, la conversion est erronée.
- Pour les autres valeurs de type référence, si le type référence prend en charge une telle conversion, cette conversion est utilisée ; sinon, la conversion est erronée.
6.6 Conversion en decimal
Les règles de conversion d’une valeur en type decimal sont les suivantes :
- La valeur bool False est convertie en zéro ; la valeur bool True est convertie en 1.
- Une valeur de type char est représentée exactement.
- Une valeur de type numérique est représentée exactement ; toutefois, si cette valeur est trop grande ou trop petite pour tenir dans le type de destination, la conversion est erronée.
- Une valeur de type null est convertie en zéro.
- Une chaîne qui représente un nombre est convertie selon les règles décrites à la section §6.16 ; sinon, la conversion est erronée.
- Pour les autres valeurs de type référence, si le type référence prend en charge une telle conversion, cette conversion est utilisée ; sinon, la conversion est erronée.
- L’échelle du résultat d’une conversion réussie est telle que la partie fractionnaire n’a aucun zéro de fin.
6.7 Conversion en object
La valeur de n’importe quel type à l’exception du type null (4.1.2) peut être convertie en type object. La valeur conserve son type et sa représentation.
6.8 Conversion en string
Les règles de conversion d’une valeur en type string sont les suivantes :
- La valeur bool
$false
est convertie en « False » ; la valeur bool$true
est convertie en « True ». - Une valeur de type char est convertie en chaîne de 1 caractère contenant ce char.
- Une valeur de type numérique est convertie en chaîne ayant la forme d’un littéral numérique correspondant. Toutefois, le résultat n’a aucun espace de début ou de fin, aucun signe plus de début, les entiers sont en base 10 et il n’y a pas de suffixe de type. Pour une conversion décimale, l’échelle est préservée. Pour les valeurs de -∞, +∞ et NaN, les chaînes résultantes sont respectivement « -Infinity », « Infinity » et « NaN ».
- Une valeur de type null est convertie en chaîne vide.
- Pour un tableau unidimensionnel, le résultat est une chaîne contenant la valeur de chaque élément de ce tableau, du début à la fin, convertie en chaîne, les éléments étant séparés par le séparateur de champ de sortie actuel (§2.3.2.2). Pour un tableau contenant des éléments qui sont eux-mêmes des tableaux, seuls les éléments de niveau supérieur sont convertis. La chaîne utilisée pour représenter la valeur d’un élément qui est un tableau est définie par l’implémentation. Pour un tableau multidimensionnel, le tableau est aplati (§9.12), puis traité comme un tableau unidimensionnel.
- Une valeur de type null est convertie en chaîne vide.
- Une valeur de type scriptblock est convertie en chaîne contenant le texte de ce bloc sans les caractères de délimitation { et }.
- Pour une valeur de type d’énumération, le résultat est une chaîne contenant le nom de chaque constante d’énumération encodée dans cette valeur, séparés par des virgules.
- Pour les autres valeurs de type référence, si le type référence prend en charge une telle conversion, cette conversion est utilisée ; sinon, la conversion est erronée.
La chaîne utilisée pour représenter la valeur d’un élément qui est un tableau se présente sous la forme System.type[]
, System.type[,]
, etc. Pour les autres types référence, la méthode ToString
est appelée. Pour les autres types énumérables, la valeur source est traitée comme un tableau unidimensionnel.
6.9 Conversion en array
Les règles de conversion d’une valeur en type array sont les suivantes :
- Le type cible ne peut pas être un tableau multidimensionnel.
- Une valeur de type null est conservée telle quelle.
- Pour une valeur scalaire autre que
$null
ou une valeur de type hashtable, un tableau à 1 élément est créé, dont la valeur est le scalaire après conversion en type de l’élément cible. - Pour une valeur de tableau unidimensionnel, un tableau du type cible est créé et chaque élément est copié avec conversion du tableau source en élément correspondant dans le tableau cible.
- Pour une valeur de tableau multidimensionnel, le tableau est d’abord aplati (§9.12), puis traité comme une valeur de tableau unidimensionnel.
- Une valeur de chaîne est convertie en un tableau de char ayant la même longueur, les caractères successifs de la chaîne occupant les positions correspondantes dans le tableau.
Pour les autres types énumérables, un tableau à 1 élément est créé, dont la valeur est l’élément correspondant après conversion en type de l’élément cible, si une telle conversion existe. Sinon, la conversion est erronée.
6.10 Conversion en xml
L’objet est converti en type string, puis en objet Document XML de type xml
.
6.11 Conversion en regex
Une expression qui désigne une valeur de type string peut être convertie en type regex
.
6.12 Conversion en scriptblock
Les règles de conversion d’une valeur en type scriptblock
sont les suivantes :
- Une valeur de chaîne est traitée comme le nom d’une commande, suivi éventuellement d’arguments pour appeler cette commande.
6.13 Conversion en types d’énumération
Les règles de conversion d’une valeur en type d’énumération sont les suivantes :
- Une valeur de type string qui contient l’une des valeurs nommées (en respectant la casse) pour un type d’énumération est convertie en cette valeur nommée.
- Une valeur de type string qui contient une liste de valeurs nommées séparées par des virgules (en respectant la casse) pour un type d’énumération est convertie en OR au niveau du bit de toutes ces valeurs nommées.
6.14 Conversion en autres types référence
Les règles de conversion d’une valeur en type référence autre qu’un type array ou string sont les suivantes :
- Une valeur de type null est conservée telle quelle.
- Sinon, le comportement est défini par l’implémentation.
Un certain nombre d’éléments entrent en jeu ici, comme l’utilisation possible de constructeurs à argument unique ou de constructeurs par défaut si la valeur est un hashtable, d’opérateurs de conversion implicites et explicites, et de méthodes Parse pour le type cible, l’utilisation de Convert.ConvertTo et le mécanisme de conversion ETS.
6.15 Conversions arithmétiques courantes
Si aucun des opérandes ne désigne une valeur de type numérique :
- Si l’opérande gauche désigne une valeur de type bool, la conversion est erronée.
- Sinon, tous les opérandes désignant la valeur
$null
sont convertis en zéro de type int et le processus se poursuit avec les conversions numériques listées ci-dessous. - Sinon, si l’opérande gauche désigne une valeur de type char et que l’opérande droit désigne une valeur de type bool, la conversion est erronée.
- Sinon, si l’opérande gauche désigne une valeur de type string mais ne représente pas un nombre (§6.16), la conversion est erronée.
- Sinon, si l’opérande droit désigne une valeur de type string mais ne représente pas un nombre (§6.16), la conversion est erronée.
- Sinon, tous les opérandes désignant des valeurs de type string sont convertis en nombres (§6.16), et le processus se poursuit avec les conversions numériques listées ci-dessous.
- Sinon, la conversion est erronée.
Conversions numériques :
- Si un opérande désigne une valeur de type decimal, la valeur désignée par l’autre opérande est convertie en ce type, si nécessaire. Le résultat a le type decimal.
- Sinon, si un opérande désigne une valeur de type double, la valeur désignée par l’autre opérande est convertie en ce type, si nécessaire. Le résultat a le type double.
- Sinon, si un opérande désigne une valeur de type float, les valeurs désignées par les deux opérandes sont converties en type double, si nécessaire. Le résultat a le type double.
- Sinon, si un opérande désigne une valeur de type long, la valeur désignée par l’autre opérande est convertie en ce type, si nécessaire. Le résultat a le premier type de la séquence long et double qui peut représenter sa valeur.
- Sinon, les valeurs désignées par les deux opérandes sont converties en type int, si nécessaire. Le résultat a le premier type de la séquence int, long, double qui peut représenter sa valeur sans troncation.
6.16 Conversion d’une chaîne en type numérique
Selon son contenu, une chaîne peut être convertie explicitement ou implicitement en valeur numérique. Plus précisément :
- Une chaîne vide est convertie en valeur zéro.
- Les espaces de début et de fin sont ignorés ; toutefois, une chaîne ne peut pas contenir uniquement des espaces.
- Une chaîne contenant uniquement des espaces blancs et/ou des marques de fin de ligne est convertie en valeur zéro.
- Un signe + ou - de début est autorisé.
- Un nombre entier peut avoir un préfixe hexadécimal (0x ou 0X).
- Un exposant éventuellement signé est autorisé.
- Les suffixes et multiplicateurs de type ne sont pas autorisés.
- Les chaînes à casse distincte « -Infinity », « Infinity » et « NaN » sont reconnues respectivement comme les valeurs -∞, +∞ et NaN.
6.17 Conversion durant la liaison de paramètres
Pour plus d’informations sur la liaison de paramètres, consultez §8.14.
Quand la valeur d’une expression est liée à un paramètre, vous devez tenir compte de considérations supplémentaires en matière de conversion :
- Si le type de paramètre est bool ou switch (§4.2.5, §8.10.5) et que le paramètre n’a aucun argument, la valeur du paramètre dans la commande appelée est définie sur
$true
. Si le type de paramètre est autre que bool ou switch, un paramètre sans argument est erroné. - Si le type de paramètre est switch et que la valeur de l’argument est
$null
, la valeur du paramètre est définie sur$false
. - Si le type de paramètre est object ou est identique au type de l’argument, la valeur de l’argument est passée sans conversion.
- Si le type de paramètre n’est pas object ou scriptblock, un argument de type scriptblock est évalué et son résultat est passé comme valeur de l’argument. (C’est ce qu’on appelle une liaison de bloc de script différée.) Si le type de paramètre est object ou scriptblock, un argument de type scriptblock est passé tel quel.
- Si le type de paramètre est une collection de type T2 et que l’argument est un scalaire de type T1, ce scalaire est converti en collection de type T2 contenant un élément. Si nécessaire, la valeur scalaire est convertie en type T2 en utilisant les règles de conversion de cette section.
- Si le type de paramètre est un type scalar autre que object et que l’argument est une collection, l’argument est erroné.
- Si le type de paramètre attendu est une collection de type T2 et que l’argument est une collection de type T1, l’argument est converti en collection de type T2 ayant la même longueur que la collection d’arguments. Si nécessaire, les valeurs des éléments de la collection d’arguments sont converties en type T2 selon les règles de conversion de cette section.
- Si les étapes ci-dessus et les conversions spécifiées plus haut dans ce chapitre ne suffisent pas, les règles de la section §6.18 sont appliquées. En cas d’échec, la liaison de paramètre échoue.
6.18 Conversion .NET
Pour une conversion implicite, les conversions intégrées de PowerShell sont essayées en premier. Si elles ne permettent pas de résoudre la conversion, les convertisseurs personnalisés .NET ci-dessous sont essayés, dans l’ordre, de haut en bas. Si une conversion est trouvée, mais qu’elle lève une exception, la conversion a échoué.
PSTypeConverter : il existe deux façons d’associer l’implémentation de la classe PSTypeConverter à sa classe cible. Vous pouvez soit utiliser le fichier de configuration de type (types.ps1xml), soit appliquer l’attribut
System.ComponentModel.TypeConverterAttribute
à la classe cible. Pour plus d’informations, consultez la documentation du kit SDK PowerShell.TypeConverter : ce type CLR propose un procédé unifié pour convertir les types de valeurs en autres types, ainsi que pour accéder aux valeurs et sous-propriétés standard. Le plus souvent, un convertisseur convertit un type en représentation textuelle et vice versa. Le convertisseur de type pour une classe est lié à la classe avec un
System.ComponentModel.TypeConverterAttribute
. À moins que cet attribut ne soit remplacé, toutes les classes qui héritent de cette classe utilisent le même convertisseur de type que la classe de base. Pour plus d’informations, reportez-vous à la documentation du kit SDK PowerShell et du framework Microsoft .NET.Méthode Parse : si le type source est string et que le type de destination a une méthode appelée
Parse
, cette méthode est appelée pour effectuer la conversion.Constructeurs : si le type de destination a un constructeur acceptant un seul argument dont le type est celui du type source, ce constructeur est appelé pour effectuer la conversion.
Opérateur cast implicite : si le type source a un opérateur cast implicite qui convertit en type de destination, cet opérateur est appelé pour effectuer la conversion.
Opérateur cast explicite : si le type source a un opérateur cast explicite qui convertit en type de destination, cet opérateur est appelé pour effectuer la conversion. Si le type de destination a un opérateur cast explicite qui convertit le type source, cet opérateur est appelé pour effectuer la conversion.
IConvertable :
System.Convert.ChangeType
est appelé pour effectuer la conversion.
6.19 Conversion en ordered
Les règles de conversion d’une valeur en pseudo-type ordered sont les suivantes :
- Si la valeur est un littéral de hachage (§2.3.5.6), le résultat est un objet avec un type défini par l’implémentation qui se comporte comme un hashtable et l’ordre des clés correspond à l’ordre spécifié dans le littéral de hachage.
- Sinon, le comportement est défini par l’implémentation.
Seuls les littéraux de hachage (§2.3.5.6) peuvent être convertis en ordered. Le résultat est une instance de System.Collections.Specialized.OrderedDictionary
.
6.20 Conversion en pscustomobject
Les règles de conversion d’une valeur en pseudo-type pscustomobject sont les suivantes :
- Une valeur de type hashtable est convertie en objet PowerShell. Chaque clé du hashtable devient un NoteProperty avec la valeur correspondante.
- Sinon, le comportement est défini par l’implémentation.
La conversion est toujours autorisée, mais elle ne change pas le type de la valeur.