Share via


6. Conversões

Uma conversão tipo é realizada quando um valor de um tipo é usado num contexto que requer um tipo diferente. Se tal conversão acontecer automaticamente, é conhecida como conversão implícita. (Um exemplo comum disso é com alguns operadores que precisam converter um ou mais dos valores designados pelos seus operáticos.) A conversão implícita é permitida desde que o sentido do valor da fonte seja preservado, tal como a perda de precisão de um número quando é convertido.

O operador do elenco (§7.2.9) permite uma conversão explícita.

As conversões são discutidas abaixo, sendo as informações suplementares fornecidas, conforme necessário, na descrição de cada operador no §6.19.

A conversão explícita de um valor para o tipo que já tem não causa qualquer alteração a esse valor ou à sua representação.

As regras para a conversão de entrega quando o valor de uma expressão está a ser vinculado a um parâmetro estão abrangidas por §6.17.

6.1 Conversão para anular

Um valor de qualquer tipo pode ser descartado explicitamente, lançando-o para escrever vazio. Não há resultado.

6.2 Conversão para bool

As regras para a conversão de qualquer valor para tipo bool são as seguintes:

  • Um valor numérico ou carvão de zero é convertido em Falso; um valor numérico ou carvão de não-zero é convertido para Verdadeiro.
  • Um valor de tipo nulo é convertido em Falso.
  • Uma cadeia de comprimento 0 é convertida em Falso; uma cadeia de comprimento > 0 é convertido para Verdadeiro.
  • Um parâmetro de comutação com valor $true é convertido em Verdadeiro, e um com valor $false é convertido em Falso.
  • Todos os outros valores de referência não nulos são convertidos para True.

Se o tipo implementar iList:

  • Se o comprimento do objeto > 2, o valor é convertido em Verdadeiro.
  • Se o comprimento do objeto é 1 e o primeiro elemento não é em si uma Lista I, então se o valor desse elemento é verdadeiro, o valor é convertido para Verdadeiro.
  • Caso contrário, se o Conde do primeiro elemento >= 1, o valor é convertido para Verdadeiro.
  • Caso contrário, o valor é convertido em Falso.

6.3 Conversão para char

As regras para a conversão de qualquer valor para o tipo de carvão são as seguintes:

  • A conversão de um valor de tipo bool, decimal, flutuante ou duplo está em erro.
  • Um valor de tipo nulo é convertido para o caractere nulo (U+0000).
  • Um valor inteiro cujo valor pode ser representado em tipo de char tem esse valor; caso contrário, a conversão está em erro.
  • A conversão de um valor de corda com um comprimento diferente de 1 está errada.
  • Um valor de corda com um comprimento 1 é convertido para um char tendo o valor de um personagem.
  • Um valor de tipo numérico cujo valor após arredondamento de qualquer peça fracionada pode ser representado no tipo de destino tem esse valor arredondado; caso contrário, a conversão está em erro.
  • Para outros valores do tipo de referência, se o tipo de referência suportar tal conversão, essa conversão é utilizada; caso contrário, a conversão está em erro.

6.4 Conversão para inteiro

As regras para converter qualquer valor para digitar byte, int ou long são as seguintes:

  • O valor bool Falso é convertido para zero; o valor bool True é convertido para 1.
  • Um valor de tipo de char cujo valor pode ser representado no tipo de destino tem esse valor; caso contrário, a conversão está em erro.
  • Um valor de tipo numérico cujo valor após arredondamento de qualquer peça fracionada pode ser representado no tipo de destino tem esse valor arredondado; caso contrário, a conversão está em erro.
  • Um valor do tipo nulo é convertido para zero.
  • Uma corda que representa um número é convertida como descrito em §6.16. Se após a truncação da parte fracionada o resultado puder ser representado no tipo de destino, a cadeia está bem formada e tem o tipo de destino; caso contrário, a conversão está em erro. Se a cadeia não representar um número, a conversão está errada.
  • Para outros valores do tipo de referência, se o tipo de referência suportar tal conversão, essa conversão é utilizada; caso contrário, a conversão está em erro.

6.5 Conversão para flutuar e dobrar

As regras para a conversão de qualquer valor para tipo flutuante ou duplo são as seguintes:

  • O valor bool Falso é convertido para zero; o valor bool True é convertido para 1.
  • Um valor de carvão é representado exatamente.
  • Um valor de tipo numérico é representado exatamente, se possível; no entanto, para conversões int, longas e decimais para flutuar, e para conversões longas e decimais para duplicar, algumas das partes menos significativas do valor inteiro podem ser perdidas.
  • Um valor do tipo nulo é convertido para zero.
  • Uma corda que representa um número é convertida como descrito em §6.16; caso contrário, a conversão está em erro.
  • Para outros valores do tipo de referência, se o tipo de referência suportar tal conversão, essa conversão é utilizada; caso contrário, a conversão está em erro.

6.6 Conversão para decimal

As regras para a conversão de qualquer valor para decimal tipo são as seguintes:

  • O valor bool Falso é convertido para zero; o valor bool True é convertido para 1.
  • Um valor tipo char é representado exatamente.
  • Um valor tipo numérico é representado exatamente; no entanto, se esse valor for demasiado grande ou demasiado pequeno para se encaixar no tipo de destino, a conversão está errada.
  • Um valor do tipo nulo é convertido para zero.
  • Uma corda que representa um número é convertida como descrito em §6.16; caso contrário, a conversão está em erro.
  • Para outros valores do tipo de referência, se o tipo de referência suportar tal conversão, essa conversão é utilizada; caso contrário, a conversão está em erro.
  • A escala do resultado de uma conversão bem sucedida é tal que a parte fracionada não tem zeros de fuga.

6.7 Conversão para objeto

O valor de qualquer tipo, exceto o tipo nulo (4.1.2) pode ser convertido para o tipo de objeto. O valor mantém o seu tipo e representação.

6.8 Conversão para corda

As regras para converter qualquer valor para tipo de cadeia são as seguintes:

  • O valor $false bool é convertido em "Falso"; o valor $true bool é convertido em "Verdadeiro".
  • Um valor do tipo char é convertido para uma corda de 1 caracteres contendo esse carvão.
  • Um valor numérico é convertido numa corda com a forma de um literal numérico correspondente. No entanto, o resultado não tem espaços de liderança ou de fuga, nenhum sinal de liderança plus, os inteiros têm base 10, e não há sufixo tipo. Para uma conversão decimal, a balança é preservada. Para valores de -∞, +∞, e NaN, as cordas resultantes são "-Infinito", "Infinito" e "NaN", respectivamente.
  • Um valor de tipo nulo é convertido para a corda vazia.
  • Para uma matriz 1-dimensional, o resultado é uma cadeia que contém o valor de cada elemento nessa matriz, do início ao fim, convertido em corda, com elementos sendo separados pelo separador de campo de saída atual (§2.3.2.2). Para uma matriz com elementos que são eles próprios matrizes, apenas os elementos de nível superior são convertidos. A cadeia usada para representar o valor de um elemento que é uma matriz, é definida. Para uma matriz multidimensional, é achatado (§9.12) e depois tratado como uma matriz dimensional.
  • Um valor de tipo nulo é convertido para a corda vazia.
  • Um valor do tipo scriptblock é convertido para uma cadeia que contém o texto desse bloco sem os caracteres delimiting { e }.
  • Para um valor do tipo de enumeração, o resultado é uma cadeia contendo o nome de cada enumeração constante codificada nesse valor, separada por vírgulas.
  • Para outros valores do tipo de referência, se o tipo de referência suportar tal conversão, essa conversão é utilizada; caso contrário, a conversão está em erro.

A corda usada para representar o valor de um elemento que é uma matriz tem a forma System.type[], System.type[,]e assim por diante. Para outros tipos de referência, o método ToString é chamado. Para outros tipos enumeras, o valor da fonte é tratado como uma matriz unidimensional.

6.9 Conversão para matriz

As regras para converter qualquer valor para um tipo de matriz são as seguintes:

  • O tipo de alvo pode não ser uma matriz multidimensional.
  • Um valor de nula é mantido como está.
  • Para um valor escalar diferente $null ou um valor de tipo hashtable, é criado um novo conjunto de 1 elemento cujo valor é o escalar após conversão para o tipo de elemento alvo.
  • Para um valor de matriz 1 dimensional, é criada uma nova matriz do tipo alvo, e cada elemento é copiado com conversão da matriz de origem para o elemento correspondente na matriz alvo.
  • Para um valor de matriz multidimensional, esta matriz é primeiro achatada (§9.12), e depois tratada como um valor de matriz unidimensional.
  • Um valor de corda é convertido para uma matriz de carvão com o mesmo comprimento com caracteres sucessivos da corda ocupando posições correspondentes na matriz.

Para outros tipos enumeras, é criado um novo conjunto de 1 elemento cujo valor é o elemento correspondente após conversão para o tipo de elemento-alvo, se tal conversão existir. Caso contrário, a conversão está errada.

6.10 Conversão para xml

O objeto é convertido para escrever a corda e, em seguida, para um objeto de documento XML do tipo xml.

6.11 Conversão para regex

Uma expressão que designe um valor de tipo de cadeia pode ser convertida para tipo regex.

6.12 Conversão para scriptblock

As regras para a conversão de qualquer valor para tipo scriptblock são as seguintes:

  • Um valor de corda é tratado como o nome de um comando opcionalmente seguindo os argumentos para uma chamada para esse comando.

6.13 Conversão para tipos de enumeração

As regras para a conversão de qualquer valor para um tipo de enumeração são as seguintes:

  • Um valor de cadeia tipo que contém um dos valores nomeados (no que diz respeito a caso) para um tipo de enumeração é convertido para esse valor nomeado.
  • Um valor de cadeia tipo que contém uma lista separada por vírgula de valores nomeados (no que diz respeito a caso) para um tipo de enumeração é convertido para o bitwise-OR de todos os valores nomeados.

6.14 Conversão para outros tipos de referência

As regras para converter qualquer valor para um tipo de referência que não seja um tipo de matriz ou uma corda são as seguintes:

  • Um valor de nula é mantido como está.
  • Caso contrário, o comportamento é definido.

Uma série de peças de maquinaria vêm para brincar aqui; incluem a eventual utilização de construtores de argumentos únicos ou construtores predefinidos se o valor for um operador de conversão hash, implícito e explícito, bem como métodos parse para o tipo-alvo; a utilização do Convert.ConvertTo; e o mecanismo de conversão do ETS.

6.15 Conversões aritméticas habituais

Se nenhum dos óperas designa um valor com tipo numérico, então

  • Se a ópera esquerda designar um valor de tipo bool, a conversão está em erro.
  • Caso contrário, todos os operands que designam o valor $null são convertidos para zero do tipo int e o processo continua com as conversões numéricas listadas abaixo.
  • Caso contrário, se a ópera esquerda designar um valor de tipo char e a ópera direita designar um valor de tipo bool, a conversão está em erro.
  • Caso contrário, se a ópera esquerda designar um valor de cadeia tipo mas não representar um número (§6.16), a conversão está errada.
  • Caso contrário, se o operand direito designar um valor de cadeia tipo mas não representar um número (§6.16), a conversão está em erro.
  • Caso contrário, todos os operos que designam valores de tipo de cadeia são convertidos em números (§6.16), e o processo continua com as conversões numéricas listadas abaixo.
  • Caso contrário, a conversão está errada.

Conversões numéricas:

  • Se um operand designar um valor de decimal tipo, o valor designado pelo outro operand é convertido para esse tipo, se necessário. O resultado tem tipo decimal.
  • Caso contrário, se um operand designar um valor de duplo tipo, o valor designado pelo outro operand é convertido para esse tipo, se necessário. O resultado tem o dobro do tipo.
  • Caso contrário, se um operand designar um valor de tipo flutuante, os valores designados por ambos os operands são convertidos para tipo duplo, se necessário. O resultado tem o dobro do tipo.
  • Caso contrário, se um operand designar um valor de tipo longo, o valor designado pelo outro valor operand é convertido para esse tipo, se necessário. O resultado tem o tipo primeiro na sequência longa e dupla que pode representar o seu valor.
  • Caso contrário, os valores designados por ambos os operands são convertidos para digitar int, se necessário. O resultado tem o primeiro na sequência int, longo, duplo que pode representar o seu valor sem truncação.

6.16 Conversão de corda para tipo numérico

Dependendo do seu conteúdo, uma cadeia pode ser convertida explicitamente ou implicitamente para um valor numérico. Mais concretamente:

  • Uma corda vazia é convertida para o valor zero.
  • Os espaços de liderança e de fuga são ignorados; no entanto, uma corda não pode consistir apenas em espaços.
  • Uma corda que contenha apenas espaço branco e/ou terminadores de linha é convertida para o valor zero.
  • Um sinal de liderança + ou - é permitido.
  • Um número inteiro pode ter um prefixo hexamal (0x ou 0X).
  • É permitido um expoente assinado opcionalmente.
  • Não são permitidos sufixos e multiplicadores do tipo.
  • As cordas "-Infinito", "Infinito" e "NaN" são reconhecidas como os valores -∞, +∞, e NaN, respectivamente.

6.17 Conversão durante a ligação dos parâmetros

Para obter informações sobre a ligação dos parâmetros consulte §8.14.

Quando o valor de uma expressão está ligado a um parâmetro, existem considerações de conversão extra, como descrito abaixo:

  • Se o tipo de parâmetro for bool ou switch (§4.2.5, §8.10.5) e o parâmetro não tiver argumentos, o valor do parâmetro no comando chamado é definido para $true. Se o tipo de parâmetro for diferente de bool ou switch, um parâmetro sem argumento está errado.
  • Se o tipo de parâmetro for o interruptor e o valor do argumento for $null, o valor do parâmetro é definido para $false.
  • Se o tipo de parâmetro for objeto ou for o mesmo que o tipo de argumento, o valor do argumento é passado sem conversão.
  • Se o tipo de parâmetro não for objeto ou scriptblock, um argumento com bloco de scripts de tipo é avaliado e o seu resultado é passado como valor do argumento. (Isto é conhecido como ligação de bloco de script atrasado.) Se o tipo de parâmetro for objeto ou scriptblock, um argumento com bloco de scripts de tipo é passado como está.
  • Se o tipo de parâmetro for uma coleção do tipo T2, e o argumento for um escalar do tipo T1, esse scalar é convertido numa coleção do tipo T2 contendo um elemento. Se necessário, o valor do escalar é convertido para o tipo T2 utilizando as regras de conversão desta secção.
  • Se o tipo de parâmetro for um tipo escalar diferente do objeto e o argumento for uma coleção, o argumento está errado.
  • Se o tipo de parâmetro esperado for uma coleção do tipo T2, e o argumento for uma coleção do tipo T1, o argumento é convertido para uma coleção de tipo T2 com o mesmo comprimento que a coleção de argumentos. Se necessário, os valores do elemento de recolha de argumentos são convertidos para o tipo T2 utilizando as regras de conversão desta secção.
  • Se os passos acima referidos e as conversões especificadas anteriormente no presente capítulo não forem suficientes, as regras do §6.18 são aplicadas. Se falharem, a ligação do parâmetro falha.

6.18 .Conversão LÍQUIDA

Para uma conversão implícita, as conversões incorporadas da PowerShell são experimentos primeiro. Se não conseguirem resolver a conversão, os conversores personalizados .NET abaixo são experimentados, por ordem, de cima para baixo. Se uma conversão for encontrada, mas lançar uma exceção, a conversão falhou.

  • PSTypeConverter: Existem duas formas de associar a implementação da classe PSTypeConverter à sua classe-alvo: através do ficheiro de configuração tipo (tipos.ps1xml) ou aplicando o System.ComponentModel.TypeConverterAttribute atributo à classe-alvo. Consulte a documentação powerShell SDK para obter mais informações.

  • TipoConverter: Este tipo CLR fornece uma forma unificada de converter tipos de valores para outros tipos, bem como para aceder a valores padrão e sub-propriedades. O tipo de conversor mais comum é aquele que se converte de e para uma representação de texto. O tipo de conversor para uma classe está ligado à classe com um System.ComponentModel.TypeConverterAttribute. A menos que este atributo seja ultrapassado, todas as classes que herdam desta classe usam o mesmo tipo de conversor que a classe base. Consulte a Documentação-Quadro PowerShell SDK e a documentação-quadro microsoft .NET para obter mais informações.

  • Método parse: Se o tipo de origem for string e o tipo de destino tiver um método chamado Parse, esse método é chamado para realizar a conversão.

  • Construtores: Se o tipo de destino tiver um construtor tendo um único argumento cujo tipo é o do tipo de origem, esse construtor é chamado para realizar a conversão.

  • Operador de cast implícito: Se o tipo de fonte tiver um operador de elenco implícito que se converte para o tipo de destino, esse operador é chamado a realizar a conversão.

  • Operador de cast explícito: Se o tipo de fonte tiver um operador de elenco explícito que se converte para o tipo de destino, esse operador é chamado a realizar a conversão. Se o tipo de destino tiver um operador de função explícito que se converte do tipo de origem, esse operador é chamado a realizar a conversão.

  • IConvertível: System.Convert.ChangeType é chamado para realizar a conversão.

6.19 Conversão a encomendado

As regras para a conversão de qualquer valor para o pseudo-tipo encomendado são as seguintes:

  • Se o valor for um hash literal (§2.3.5.6), o resultado é um objeto com um tipo definido de implementação que se comporta como um hash e a ordem das teclas corresponde à ordem especificada no hash literal.
  • Caso contrário, o comportamento é definido.

Apenas os hash (§2.3.5.6) podem ser convertidos para encomenda. O resultado é um exemplo de System.Collections.Specialized.OrderedDictionary.

6.20 Conversão para pscustomobject

As regras para a conversão de qualquer valor para o pseudo-tipo pscustomobject são as seguintes:

  • Um valor de tipo hashtable é convertido num objeto PowerShell. Cada tecla no hash torna-se uma NotaProperty com o valor correspondente.
  • Caso contrário, o comportamento é definido.

A conversão é sempre permitida mas não altera o tipo de valor.