Conversioni

Una conversione del tipo viene eseguita quando un valore di un tipo viene usato in un contesto che richiede un tipo diverso. Se tale conversione viene eseguita automaticamente, è nota come conversione implicita. Un esempio comune è relativo ad alcuni operatori che devono convertire uno o più valori designati dai relativi operandi. La conversione implicita è consentita purché il senso del valore di origine sia mantenuto, ad esempio nessuna perdita di precisione di un numero durante la conversione.

L'operatore cast (Sezione 7.2.9) consente la conversione esplicita.

Le conversioni sono descritte di seguito, con informazioni supplementari fornite in base alle esigenze nella descrizione di ogni operatore in §6.19.

La conversione esplicita di un valore nel tipo già presente non comporta alcuna modifica a tale valore o alla relativa rappresentazione.

Le regole per la conversione manuale quando il valore di un'espressione viene associato a un parametro sono coperte in §6.17.

Conversione in void

Un valore di qualsiasi tipo può essere eliminato in modo esplicito eseguendo il cast al tipo void. Non viene restituito alcun risultato.

Conversione in bool

Le regole per la conversione di qualsiasi valore nel tipo bool sono le seguenti:

  • Un valore numerico o char pari a zero viene convertito in False. un valore numerico o char diverso da zero viene convertito in True.
  • Un valore di tipo Null viene convertito in False.
  • Una stringa di lunghezza 0 viene convertita in False. una stringa di lunghezza > 0 viene convertita in True.
  • Un parametro switch con valore $true viene convertito in True e uno con valore viene convertito in $false False.
  • Tutti gli altri valori di tipo riferimento non Null vengono convertiti in True.

Se il tipo implementa IList:

  • Se length dell'oggetto > 2, il valore viene convertito in True.
  • Se la lunghezza dell'oggetto è 1 e il primo elemento non è di per sé un oggetto IList, se il valore di tale elemento è true, il valore viene convertito in True.
  • In caso contrario, se count del primo elemento >= 1, il valore viene convertito in True.
  • In caso contrario, il valore viene convertito in False.

Conversione in char

Le regole per la conversione di qualsiasi valore nel tipo char sono le seguenti:

  • La conversione di un valore di tipo bool, decimal, float o double non è stata eseguita.
  • Un valore di tipo Null viene convertito nel carattere Null (U+0000).
  • Un valore di tipo Integer il cui valore può essere rappresentato nel tipo char ha tale valore; In caso contrario, la conversione è in errore.
  • La conversione di un valore stringa con lunghezza diversa da 1 non è valida.
  • Un valore stringa con lunghezza 1 viene convertito in un char con il valore di tale carattere.
  • Un valore di tipo numerico il cui valore dopo l'arrotondamento di qualsiasi parte frazionaria può essere rappresentato nel tipo di destinazione ha tale valore arrotondato; In caso contrario, la conversione è in errore.
  • Per altri valori di tipo riferimento, se il tipo riferimento supporta tale conversione, viene usata tale conversione; In caso contrario, la conversione è in errore.

Conversione in integer

Le regole per la conversione di qualsiasi valore nel tipo byte, int o long sono le seguenti:

  • Il valore booleano False viene convertito in zero. Il valore booleano True viene convertito in 1.
  • Un valore di tipo char il cui valore può essere rappresentato nel tipo di destinazione ha tale valore; In caso contrario, la conversione è in errore.
  • Un valore di tipo numerico il cui valore dopo l'arrotondamento di qualsiasi parte frazionaria può essere rappresentato nel tipo di destinazione ha tale valore arrotondato; In caso contrario, la conversione è in errore.
  • Un valore di tipo Null viene convertito in zero.
  • Una stringa che rappresenta un numero viene convertita come descritto in .6.16. Se dopo il troncamento della parte frazionaria il risultato può essere rappresentato nel tipo di destinazione, il formato della stringa è corretto e il tipo di destinazione è ; In caso contrario, la conversione è in errore. Se la stringa non rappresenta un numero, la conversione viene erta.
  • Per altri valori di tipo riferimento, se il tipo di riferimento supporta tale conversione, viene usata tale conversione; In caso contrario, la conversione è in errore.

Conversione in float e double

Le regole per la conversione di qualsiasi valore nel tipo float o double sono le seguenti:

  • Il valore bool False viene convertito in zero. Il valore bool True viene convertito in 1.
  • Un valore char è rappresentato esattamente.
  • Un valore di tipo numerico è rappresentato esattamente, se possibile; Tuttavia, per le conversioni int, long e decimal in float e per le conversioni long e decimal in double, alcuni dei bit meno significativi del valore integer possono andare persi.
  • Un valore di tipo Null viene convertito in zero.
  • Una stringa che rappresenta un numero viene convertita come descritto in §6.16; In caso contrario, la conversione è in errore.
  • Per altri valori di tipo riferimento, se il tipo di riferimento supporta tale conversione, viene usata tale conversione; In caso contrario, la conversione è in errore.

Conversione in decimale

Le regole per la conversione di qualsiasi valore nel tipo decimal sono le seguenti:

  • Il valore bool False viene convertito in zero. Il valore bool True viene convertito in 1.
  • Un valore di tipo char è rappresentato esattamente.
  • Un valore di tipo numerico è rappresentato esattamente; Tuttavia, se il valore è troppo grande o troppo piccolo per essere contenuto nel tipo di destinazione, la conversione viene erta.
  • Un valore di tipo Null viene convertito in zero.
  • Una stringa che rappresenta un numero viene convertita come descritto in §6.16; In caso contrario, la conversione è in errore.
  • Per altri valori di tipo riferimento, se il tipo di riferimento supporta tale conversione, viene usata tale conversione; In caso contrario, la conversione è in errore.
  • La scala del risultato di una conversione riuscita è tale che la parte frazionaria non ha zeri finali.

Conversione in oggetto

Il valore di qualsiasi tipo ad eccezione del tipo Null (4.1.2) può essere convertito nel tipo object. Il valore mantiene il tipo e la rappresentazione.

Conversione in stringa

Le regole per la conversione di qualsiasi valore nel tipo string sono le seguenti:

  • Il valore bool $false viene convertito in "False", il valore booleano $true viene convertito in "True".
  • Un valore di tipo char viene convertito in una stringa di 1 carattere contenente tale char.
  • Un valore di tipo numerico viene convertito in una stringa con il formato di un valore letterale numerico corrispondente. Tuttavia, il risultato non contiene spazi iniziali o finali, nessun segno più iniziale, numeri interi in base 10 e nessun suffisso di tipo. Per una conversione decimale, la scala viene mantenuta. Per i valori -∞, +∞ e NaN, le stringhe risultanti sono rispettivamente "-Infinity", "Infinity" e "NaN".
  • Un valore di tipo Null viene convertito nella stringa vuota.
  • Per una matrice unidimensionale, il risultato è una stringa contenente il valore di ogni elemento della matrice, dall'inizio alla fine, convertito in stringa, con gli elementi separati dal separatore dei campi di output corrente (?2.3.2.2). Per una matrice con elementi che sono a loro volta matrici, vengono convertiti solo gli elementi di primo livello. La stringa usata per rappresentare il valore di un elemento che è una matrice, è definita dall'implementazione. Per una matrice multidimensionale, viene bidimensionale (9,12) e quindi trattata come matrice unidimensionale.
  • Un valore di tipo Null viene convertito nella stringa vuota.
  • Un valore di tipo scriptblock viene convertito in una stringa contenente il testo del blocco senza i caratteri { e } di delimitazione.
  • Per un valore di tipo enumerazione, il risultato è una stringa contenente il nome di ogni costante di enumerazione codificata in tale valore, separati da virgole.
  • Per altri valori di tipo riferimento, se il tipo riferimento supporta tale conversione, viene usata tale conversione; In caso contrario, la conversione è in errore.

Stringa utilizzata per rappresentare il valore di un elemento che è una matrice nel formato System.type[] System.type[,] , e così via. Per altri tipi riferimento, viene ToString chiamato il metodo . Per altri tipi enumerabili, il valore di origine viene considerato come una matrice unidimensionale.

Conversione in matrice

Le regole per la conversione di qualsiasi valore in un tipo matrice sono le seguenti:

  • Il tipo di destinazione non può essere una matrice multidimensionale.
  • Un valore di tipo Null viene mantenuto così come è.
  • Per un valore scalare diverso da o un valore di tipo hashtable, viene creata una nuova matrice a 1 elemento il cui valore è scalare dopo la conversione nel tipo di elemento $null di destinazione.
  • Per un valore di matrice unidimensionale, viene creata una nuova matrice del tipo di destinazione e ogni elemento viene copiato con la conversione dalla matrice di origine all'elemento corrispondente nella matrice di destinazione.
  • Per un valore di matrice multidimensionale, tale matrice viene prima appiattita (Sezione 9.12) e quindi considerata come un valore di matrice unidimensionale.
  • Un valore stringa viene convertito in una matrice di caratteri con la stessa lunghezza dei caratteri successivi della stringa che occupano le posizioni corrispondenti nella matrice.

Per altri tipi enumerabili, viene creata una nuova matrice a 1 elemento il cui valore è l'elemento corrispondente dopo la conversione nel tipo di elemento di destinazione, se esiste una conversione di questo tipo. In caso contrario, la conversione è in errore.

Conversione in xml

L'oggetto viene convertito nel tipo string e quindi in un oggetto Documento XML di tipo xml .

Conversione in espressione regolare

Un'espressione che definisce un valore di tipo stringa può essere convertita nel tipo regex .

Conversione in scriptblock

Le regole per la conversione di qualsiasi valore nel tipo scriptblock sono le seguenti:

  • Un valore stringa viene considerato come il nome di un comando seguito facoltativamente da argomenti a una chiamata a tale comando.

Conversione in tipi di enumerazione

Le regole per la conversione di qualsiasi valore in un tipo di enumerazione sono le seguenti:

  • Un valore di tipo stringa che contiene uno dei valori denominati (indipendentemente dalla distinzione tra maiuscole e minuscole) per un tipo di enumerazione viene convertito in tale valore denominato.
  • Un valore di tipo stringa che contiene un elenco delimitato da virgole di valori denominati (indipendentemente dalla distinzione tra maiuscole e minuscole) per un tipo di enumerazione viene convertito nell'operatore OR bit per bit di tutti i valori denominati.

Conversione in altri tipi riferimento

Le regole per la conversione di qualsiasi valore in un tipo riferimento diverso da un tipo matrice o una stringa sono le seguenti:

  • Un valore di tipo Null viene mantenuto così come è.
  • In caso contrario, il comportamento è definito dall'implementazione.

In questo caso vengono riprodotti diversi macchinari. tra cui il possibile uso di costruttori a argomento singolo o costruttori predefiniti se il valore è una tabella hash, operatori di conversione implicita ed esplicita e metodi Parse per il tipo di destinazione; l'uso di Convert.ConvertTo; e il meccanismo di conversione ETS.

Conversioni aritmetiche comuni

Se nessuno degli operandi definisce un valore di tipo numerico,

  • Se l'operando sinistro designa un valore di tipo bool, la conversione non viene eseguita.
  • In caso contrario, tutti gli operandi che designano il valore vengono convertiti in zero di tipo int e il processo continua con le $null conversioni numeriche elencate di seguito.
  • In caso contrario, se l'operando sinistro definisce un valore di tipo char e l'operando destro definisce un valore di tipo bool, la conversione non viene eseguita.
  • In caso contrario, se l'operando sinistro designa un valore di tipo string ma non rappresenta un numero (=6.16), la conversione non viene eseguita.
  • In caso contrario, se l'operando destro designa un valore di tipo string ma non rappresenta un numero (=6.16), la conversione non viene eseguita.
  • In caso contrario, tutti gli operandi che designano valori di tipo stringa vengono convertiti in numeri (\6.16) e il processo continua con le conversioni numeriche elencate di seguito.
  • In caso contrario, la conversione è in errore.

Conversioni numeriche:

  • Se un operando definisce un valore di tipo decimal, il valore designato dall'altro operando viene convertito in tale tipo, se necessario. Il risultato è di tipo decimal.
  • In caso contrario, se un operando definisce un valore di tipo double, il valore designato dall'altro operando viene convertito in tale tipo, se necessario. Il risultato è di tipo double.
  • In caso contrario, se un operando definisce un valore di tipo float, i valori designati da entrambi gli operandi vengono convertiti nel tipo double, se necessario. Il risultato è di tipo double.
  • In caso contrario, se un operando definisce un valore di tipo long, il valore designato dall'altro valore dell'operando viene convertito in tale tipo, se necessario. Il risultato ha il tipo first nella sequenza long e double che può rappresentarne il valore.
  • In caso contrario, i valori designati da entrambi gli operandi vengono convertiti nel tipo int, se necessario. Il risultato ha il primo nella sequenza int, long, double che può rappresentarne il valore senza troncamento.

Conversione da stringa a tipo numerico

A seconda del contenuto, una stringa può essere convertita in modo esplicito o implicito in un valore numerico. ovvero:

  • Una stringa vuota viene convertita nel valore zero.
  • Gli spazi iniziali e finali vengono ignorati. Tuttavia, una stringa non può essere costituita solo da spazi.
  • Una stringa contenente solo spazi vuoti e/o caratteri di terminazione di riga viene convertita nel valore zero.
  • È consentito un segno + o - iniziale.
  • Un numero intero può avere un prefisso esadecimale (0x o 0X).
  • È consentito un esponente con firma facoltativa.
  • I suffissi di tipo e i moltiplicatori non sono consentiti.
  • Le stringhe con distinzione tra maiuscole e minuscole "-Infinity", "Infinity" e "NaN" vengono riconosciute rispettivamente come valori -∞, +∞ e NaN.

Conversione durante l'associazione di parametri

Per informazioni sull'associazione di parametri, vedere l'articolo sulla versione 8.14.

Quando il valore di un'espressione viene associato a un parametro, esistono considerazioni aggiuntive sulla conversione, come descritto di seguito:

  • Se il tipo di parametro è bool o switch (\4.2.5, \8.10.5) e il parametro non ha argomenti, il valore del parametro nel comando chiamato viene impostato su $true . Se il tipo di parametro è diverso da bool o switch, un parametro senza argomento è in errore.
  • Se il tipo di parametro è switch e il valore dell'argomento $null è , il valore del parametro viene impostato su $false .
  • Se il tipo di parametro è object o è uguale al tipo dell'argomento, il valore dell'argomento viene passato senza conversione.
  • Se il tipo di parametro non è object o scriptblock, viene valutato un argomento di tipo scriptblock e il risultato viene passato come valore dell'argomento. Questa operazione è nota come associazione di blocchi di script ritardati. Se il tipo di parametro è object o scriptblock, un argomento di tipo scriptblock viene passato così come è.
  • Se il tipo di parametro è una raccolta di tipo T2 e l'argomento è un valore scalare di tipo T1, tale scalare viene convertito in una raccolta di tipo T2 contenente un elemento. Se necessario, il valore scalare viene convertito nel tipo T2 usando le regole di conversione di questa sezione.
  • Se il tipo di parametro è un tipo scalare diverso da object e l'argomento è una raccolta, l'argomento è in errore.
  • Se il tipo di parametro previsto è una raccolta di tipo T2 e l'argomento è una raccolta di tipo T1, l'argomento viene convertito in una raccolta di tipo T2 con la stessa lunghezza della raccolta di argomenti. Se necessario, i valori degli elementi della raccolta di argomenti vengono convertiti nel tipo T2 usando le regole di conversione di questa sezione.
  • Se i passaggi precedenti e le conversioni specificate in precedenza in questo capitolo non sono sufficiente, vengono applicate le regole in .6.18. In caso di esito negativo, l'associazione di parametri ha esito negativo.

Conversione .NET

Per una conversione implicita, le conversioni incorporate di PowerShell vengono tentate per prime. Se non sono in grado di risolvere la conversione, vengono tentati i convertitori personalizzati .NET seguenti, in ordine, dall'alto verso il basso. Se viene trovata una conversione, ma viene generata un'eccezione, la conversione non è riuscita.

  • PSTypeConverter: esistono due modi per associare l'implementazione della classe PSTypeConverter alla relativa classe di destinazione: tramite il file di configurazione del tipo (types.ps1xml) o applicando l'attributo alla classe di System.ComponentModel.TypeConverterAttribute destinazione. Per altre informazioni, vedere la documentazione di PowerShell SDK.

  • TypeConverter: questo tipo CLR offre un modo unificato per convertire tipi di valori in altri tipi, nonché per accedere ai valori standard e alle sotto-proprietà. Il tipo più comune di convertitore è quello che esegue la conversione da e verso una rappresentazione testuale. Il convertitore di tipi per una classe è associato alla classe con System.ComponentModel.TypeConverterAttribute un oggetto . A meno che questo attributo non venga sottoposto a override, tutte le classi che ereditano da questa classe usano lo stesso convertitore di tipi della classe di base. Per altre informazioni, vedere PowerShell SDK e la documentazione Microsoft .NET framework.

  • Metodo Parse: se il tipo di origine è string e il tipo di destinazione ha un metodo denominato , tale metodo viene chiamato Parse per eseguire la conversione.

  • Costruttori: se il tipo di destinazione ha un costruttore che accetta un singolo argomento il cui tipo è quello del tipo di origine, tale costruttore viene chiamato per eseguire la conversione.

  • Operatore Cast implicito: se il tipo di origine dispone di un operatore cast implicito che esegue la conversione nel tipo di destinazione, tale operatore viene chiamato per eseguire la conversione.

  • Operatore Cast esplicito: se il tipo di origine dispone di un operatore cast esplicito che esegue la conversione nel tipo di destinazione, tale operatore viene chiamato per eseguire la conversione. Se il tipo di destinazione ha un operatore cast esplicito che esegue la conversione dal tipo di origine, tale operatore viene chiamato per eseguire la conversione.

  • IConvertable: System.Convert.ChangeType viene chiamato per eseguire la conversione.

Conversione in ordinata

Le regole per la conversione di qualsiasi valore nell'ordine dello pseudo-tipo sono le seguenti:

  • Se il valore è un valore letterale hash (\2.3.5.6), il risultato è un oggetto con un tipo definito dall'implementazione che si comporta come una tabella hash e l'ordine delle chiavi corrisponde all'ordine specificato nel valore letterale hash.
  • In caso contrario, il comportamento è definito dall'implementazione.

Solo i valori letterali hash (\2.3.5.6) possono essere convertiti in ordinati. Il risultato è un'istanza di System.Collections.Specialized.OrderedDictionary .

Conversione in pscustomobject

Le regole per la conversione di qualsiasi valore in pscustomobject pseudo-tipo sono le seguenti:

  • Un valore di tipo hashtable viene convertito in un oggetto di PowerShell. Ogni chiave nella tabella hash diventa un elemento NoteProperty con il valore corrispondente.
  • In caso contrario, il comportamento è definito dall'implementazione.

La conversione è sempre consentita, ma non modifica il tipo del valore.