6. Conversies

Een typeconversie wordt uitgevoerd wanneer een waarde van het ene type wordt gebruikt in een context die een ander type vereist. Als een dergelijke conversie automatisch wordt gemaakt, wordt deze impliciete conversie genoemd. (Een veelvoorkomende voorbeeld hiervan is bij sommige operators die een of meer van de waarden moeten converteren die zijn aangewezen door hun operanden.) Impliciete conversie is toegestaan op voorwaarde dat het idee van de bronwaarde behouden blijft, zoals geen verlies van precisie van een getal wanneer deze wordt geconverteerd.

De cast-operator (7.2.9) staat expliciete conversie toe.

Conversies worden hieronder besproken, met aanvullende informatie die zo nodig wordt opgegeven in de beschrijving van elke operator in #6.19.

Expliciete conversie van een waarde naar het type dat deze al heeft, veroorzaakt geen wijziging in die waarde of de weergave ervan.

De regels voor het leveren van conversie wanneer de waarde van een expressie wordt gebonden aan een parameter, worden behandeld in :6.17.

6.1 Conversie naar void

Een waarde van elk type kan expliciet worden verwijderd door deze te casten om void te typen. Er is geen resultaat.

6.2 Conversie naar bool

De regels voor het converteren van een waarde naar type bool zijn als volgt:

  • Een numerieke waarde of waarde van nul wordt geconverteerd naar Onwaar; een numerieke waarde of een waarde met een waarde van een waarde die niet nul is, wordt geconverteerd naar Waar.
  • Een waarde van het type null wordt geconverteerd naar Onwaar.
  • Een tekenreeks van lengte 0 wordt geconverteerd naar False; een tekenreeks met een lengte > 0 wordt geconverteerd naar Waar.
  • Een switchparameter met waarde $true wordt geconverteerd naar True en een parameter met waarde $false wordt geconverteerd naar False.
  • Alle andere niet-null-verwijzingstypewaarden worden geconverteerd naar Waar.

Als het type IList implementeert:

  • Als de lengte van het object > 2, wordt de waarde geconverteerd naar Waar.
  • Als de lengte van het object 1 is en dat eerste element zelf geen IList is, wordt de waarde van dat element geconverteerd naar Waar als de waarde van dat element waar is.
  • Anders wordt de waarde geconverteerd naar Waar als het aantal >= 1 van het eerste element.
  • Anders wordt de waarde geconverteerd naar False.

6.3 Conversie naar char

De regels voor het converteren van een waarde naar het type char zijn als volgt:

  • De conversie van een waarde van het type bool, decimaal, float of double is fout.
  • Een waarde van het type null wordt geconverteerd naar het null-teken (U+0000).
  • Een waarde van het type geheel getal waarvan de waarde kan worden weergegeven in het type char heeft die waarde; anders wordt de conversie als fout weergegeven.
  • De conversie van een tekenreekswaarde met een andere lengte dan 1 is fout.
  • Een tekenreekswaarde met een lengte van 1 wordt geconverteerd naar een teken met de waarde van dat ene teken.
  • Een numerieke typewaarde waarvan de waarde na afronding van een breukdeel kan worden weergegeven in het doeltype, heeft die afgeronde waarde; anders wordt de conversie als fout weergegeven.
  • Voor andere referentietypewaarden wordt die conversie gebruikt als het verwijzingstype een dergelijke conversie ondersteunt; anders wordt de conversie als fout weergegeven.

6.4 Conversie naar geheel getal

De regels voor het converteren van een waarde naar type byte, int of long zijn als volgt:

  • De waarde False wordt geconverteerd naar nul; de waarde van de waarde Voor de waarde True wordt geconverteerd naar 1.
  • Een waarde van het type Char waarvan de waarde kan worden weergegeven in het doeltype heeft die waarde; anders wordt de conversie als fout weergegeven.
  • Een numerieke typewaarde waarvan de waarde na afronding van een breukdeel kan worden weergegeven in het doeltype, heeft die afgeronde waarde; anders wordt de conversie als fout weergegeven.
  • Een waarde van het type null wordt geconverteerd naar nul.
  • Een tekenreeks die een getal vertegenwoordigt, wordt geconverteerd zoals beschreven in .6.16. Als na het aftrekken van het fractionele deel het resultaat kan worden weergegeven in het doeltype, wordt de tekenreeks goed gevormd en heeft het doeltype; anders wordt de conversie als fout weergegeven. Als de tekenreeks geen getal vertegenwoordigt, is de conversie fout.
  • Voor andere referentietypewaarden wordt die conversie gebruikt als het verwijzingstype een dergelijke conversie ondersteunt; anders wordt de conversie als fout weergegeven.

6.5 Conversie naar float en dubbel

De regels voor het converteren van een waarde naar het type float of double zijn als volgt:

  • De waarde False wordt geconverteerd naar nul; de waarde van de waarde Voor de waarde True wordt geconverteerd naar 1.
  • Een waarde van het -char wordt exact weergegeven.
  • Een numerieke typewaarde wordt, indien mogelijk, exact weergegeven; Voor int-, long- en decimale conversies naar float- en voor lange en decimale conversies om te verdubbelen, kunnen enkele van de minst significante bits van de gehele waarde verloren gaan.
  • Een waarde van het type null wordt geconverteerd naar nul.
  • Een tekenreeks die een getal vertegenwoordigt, wordt geconverteerd zoals beschreven in ;6.16; anders wordt de conversie als fout weergegeven.
  • Voor andere referentietypewaarden wordt die conversie gebruikt als het verwijzingstype een dergelijke conversie ondersteunt; anders wordt de conversie als fout weergegeven.

6.6 Conversie naar decimaal

De regels voor het converteren van een waarde naar het type decimaal zijn als volgt:

  • De waarde False wordt geconverteerd naar nul; de waarde van de waarde Voor de waarde True wordt geconverteerd naar 1.
  • Een waarde van het type Char wordt exact weergegeven.
  • Een numerieke typewaarde wordt exact weergegeven; Als deze waarde echter te groot of te klein is om in het doeltype te passen, wordt de conversie als fout weergegeven.
  • Een waarde van het type null wordt geconverteerd naar nul.
  • Een tekenreeks die een getal vertegenwoordigt, wordt geconverteerd zoals beschreven in ;6.16; anders wordt de conversie als fout weergegeven.
  • Voor andere referentietypewaarden wordt die conversie gebruikt als het verwijzingstype een dergelijke conversie ondersteunt; anders wordt de conversie als fout weergegeven.
  • De schaal van het resultaat van een geslaagde conversie is zodanig dat het breukdeel geen nullen achter de komma heeft.

6.7 Conversie naar object

De waarde van elk type behalve het null-type (4.1.2) kan worden geconverteerd naar het type-object. De waarde behoudt het type en de weergave.

6.8 Conversie naar tekenreeks

De regels voor het converteren van een waarde naar type tekenreeks zijn als volgt:

  • De waarde van deool $false wordt geconverteerd naar 'False'. De waarde van de bool $true wordt geconverteerd naar 'True'.
  • Een waarde van het type Char wordt geconverteerd naar een tekenreeks van 1 teken die dat teken bevat.
  • Een numerieke typewaarde wordt geconverteerd naar een tekenreeks met de vorm van een bijbehorende numerieke letterlijke waarde. Het resultaat heeft echter geen voor- of achtervoegsel, geen vooraanstaand plusteken, gehele getallen hebben grondtal 10 en er is geen typeachtervoegsel. Voor een decimale conversie blijft de schaal behouden. Voor waarden van -∞, +∞ en NaN zijn de resulterende tekenreeksen respectievelijk '-Infinity', 'Infinity' en 'NaN'.
  • Een waarde van het type null wordt geconverteerd naar de lege tekenreeks.
  • Voor een 1-dimensionale matrix is het resultaat een tekenreeks met de waarde van elk element in die matrix, van begin tot eind, geconverteerd naar tekenreeks, met elementen die worden gescheiden door het huidige scheidingsteken voor uitvoerveld (2.3.2.2). Voor een matrix met elementen die zelf matrices zijn, worden alleen de elementen op het hoogste niveau geconverteerd. De tekenreeks die wordt gebruikt om de waarde van een element dat een matrix is weer te geven, is implementatie gedefinieerd. Voor een multidimensionale matrix wordt deze afgevlakt (9,12) en vervolgens behandeld als een 1-dimensionale matrix.
  • Een waarde van het type null wordt geconverteerd naar de lege tekenreeks.
  • Een waarde van het type scriptblock wordt geconverteerd naar een tekenreeks met de tekst van dat blok zonder de scheidingstekens { en } tekens.
  • Voor een waarde van het type enumeratie is het resultaat een tekenreeks met de naam van elke enumeratieconstante die in die waarde is gecodeerd, gescheiden door komma's.
  • Voor andere referentietypewaarden wordt die conversie gebruikt als het verwijzingstype een dergelijke conversie ondersteunt; anders wordt de conversie als fout weergegeven.

De tekenreeks die wordt gebruikt om de waarde aan te geven van een element dat een matrix is, heeft de vorm System.type[], System.type[,], en meer. Voor andere verwijzingstypen wordt de methode ToString aangeroepen. Voor andere enumereerbare typen wordt de bronwaarde behandeld als een 1-dimensionale matrix.

6.9 Conversie naar matrix

De regels voor het converteren van een waarde naar een matrixtype zijn als volgt:

  • Het doeltype is mogelijk geen multidimensionale matrix.
  • Een waarde van het type null blijft behouden zoals deze is.
  • Voor een andere scalaire $null waarde dan of een waarde van het type hashtable wordt een nieuwe matrix met één element gemaakt waarvan de waarde de scalaire waarde is na conversie naar het type doelelement.
  • Voor een 1-dimensionale matrixwaarde wordt een nieuwe matrix van het doeltype gemaakt en wordt elk element gekopieerd met conversie van de bron matrix naar het bijbehorende element in de doel matrix.
  • Voor een multidimensionale matrixwaarde wordt die matrix eerst plat gemaakt (9,12) en vervolgens behandeld als een 1-dimensionale matrixwaarde.
  • Een tekenreekswaarde wordt geconverteerd naar een matrix van tekens met dezelfde lengte met opeenvolgende tekens uit de tekenreeks die overeenkomende posities in de matrix bezetten.

Voor andere op te semuleerbare typen wordt een nieuwe matrix met één element gemaakt waarvan de waarde het overeenkomstige element is na de conversie naar het doelelementtype, als een dergelijke conversie bestaat. Anders wordt de conversie als fout weergegeven.

6.10 Conversie naar XML

Het object wordt geconverteerd naar het type tekenreeks en vervolgens naar een XML Document-object van het type xml.

6.11 Conversie naar regex

Een expressie die een waarde van het type tekenreeks aanwijzen, kan worden geconverteerd naar het type regex.

6.12 Conversie naar scriptblokkering

De regels voor het converteren van een waarde naar het type scriptblock zijn als volgt:

  • Een tekenreekswaarde wordt beschouwd als de naam van een opdracht, eventueel door argumenten voor een aanroep van die opdracht.

6.13 Conversie naar enumeratietypen

De regels voor het converteren van een waarde naar een type enumeratie zijn als volgt:

  • Een waarde van het type tekenreeks die een van de benoemde waarden (met betrekking tot het geval) voor een enumeratietype bevat, wordt geconverteerd naar die benoemde waarde.
  • Een waarde van het type tekenreeks die een door komma's gescheiden lijst met benoemde waarden (met betrekking tot het geval) voor een opsommingstype bevat, wordt geconverteerd naar de bitwise-OR van al deze benoemde waarden.

6.14 Conversie naar andere referentietypen

De regels voor het converteren van een waarde naar een ander verwijzingstype dan een matrixtype of tekenreeks zijn als volgt:

  • Een waarde van het type null blijft behouden zoals deze is.
  • Anders is het gedrag implementatie gedefinieerd.

Hier komen een aantal machinerie-onderdelen om te spelen; Deze omvatten het mogelijke gebruik van constructors met één argument of standaardcon constructors als de waarde een hashtabel, impliciete en expliciete conversieoperators en Parse-methoden voor het doeltype is; het gebruik van Convert.ConvertTo; en het ETS-conversiemechanisme.

6.15 Gebruikelijke rekenkundige conversies

Als geen van beide operanden een waarde met een numeriek type aanwijzen,

  • Als de linkeropeen een waarde van het type bool aanwijst, is de conversie fout.
  • Anders worden alle operanden $null die de waarde aanmaak, geconverteerd naar nul van het type int en wordt het proces voortgezet met de onderstaande numerieke conversies.
  • Anders, als de linkeropeen een waarde van het type char aanwijst en de rechteropend een waarde van het type bool aanwijst, is de conversie fout.
  • Als de linkeropeen een waarde van het type tekenreeks aanwijzen, maar geen getal (6,16) vertegenwoordigt, wordt de conversie als fout weergegeven.
  • Als anders de rechteropeen een waarde van het type tekenreeks aanwijzen, maar geen getal vertegenwoordigt (6,16), is de conversie fout.
  • Anders worden alle operanden die waarden van het type tekenreeks aan te geven, geconverteerd naar getallen (6,16) en wordt het proces voortgezet met de numerieke conversies die hieronder worden vermeld.
  • Anders wordt de conversie fout.

Numerieke conversies:

  • Als de ene operand een waarde van het type decimaal aanwijzen, wordt de waarde die wordt aangeduid door de andere operand, indien nodig geconverteerd naar dat type. Het resultaat heeft het type decimaal.
  • Als de ene operand anders een waarde van het type double aanwijzen, wordt de waarde die wordt aangeduid door de andere operand, indien nodig geconverteerd naar dat type. Het resultaat heeft het type double.
  • Als één operand anders een waarde van het type float aanwijzen, worden de waarden die door beide operanden worden aangeduid, zo nodig geconverteerd naar dubbel. Het resultaat heeft het type double.
  • Als de ene operand een waarde van het type long aanwijzen, wordt de waarde die wordt aangeduid door de andere operandwaarde zo nodig geconverteerd naar dat type. Het resultaat heeft het type eerst in de reeks lang en dubbel dat de waarde kan vertegenwoordigen.
  • Anders worden de waarden die zijn aangewezen door beide operanden geconverteerd naar type int, indien nodig. Het resultaat heeft de eerste in de reeks int, long, double die de waarde kan vertegenwoordigen zonder af te leiden.

6.16 Conversie van tekenreeks naar numeriek type

Afhankelijk van de inhoud kan een tekenreeks expliciet of impliciet worden geconverteerd naar een numerieke waarde. Met name:

  • Een lege tekenreeks wordt geconverteerd naar de waarde nul.
  • Voor- en achteraan spaties worden genegeerd; Een tekenreeks mag echter niet alleen uit spaties bestaan.
  • Een tekenreeks die alleen witruimte en/of regel-einden bevat, wordt geconverteerd naar de waarde nul.
  • Eén vooraanstaand + of -teken is toegestaan.
  • Een geheel getal kan een hexadecimaal voorvoegsel (0x of 0X) hebben.
  • Een optioneel ondertekende exponent is toegestaan.
  • Typeachtervoegsels en vermenigvuldigers zijn niet toegestaan.
  • De afzonderlijke tekenreeksen '-Infinity', 'Infinity' en 'NaN' worden respectievelijk herkend als de waarden -∞, +∞ en NaN.

6.17 Conversie tijdens parameterbinding

Zie voor meer informatie over parameterbinding .8.14.

Wanneer de waarde van een expressie wordt gebonden aan een parameter, zijn er extra conversieoverwegingen, zoals hieronder wordt beschreven:

  • Als het parametertype bool of switch (4.2.5, 8.10.5) is en de parameter geen argument heeft, wordt de waarde van de parameter in de aangeroepen opdracht ingesteld op $true. Als het parametertype anders is dan bool of switch, wordt een parameter zonder argument als fout weergegeven.
  • Als het parametertype switch is en de argumentwaarde is, wordt $nullde parameterwaarde ingesteld op $false.
  • Als het parametertype object is of hetzelfde is als het type van het argument, wordt de waarde van het argument zonder conversie doorgegeven.
  • Als het parametertype geen object of scriptblock is, wordt een argument met type scriptblock geëvalueerd en wordt het resultaat doorgegeven als de waarde van het argument. (Dit staat bekend als vertraagde scriptblokbinding.) Als het parametertype object of scriptblock is, wordt een argument met type scriptblock doorgegeven zoals het is.
  • Als het parametertype een verzameling van het type T2 is en het argument een scalaire waarde van het type T1 is, wordt die scalaire waarde geconverteerd naar een verzameling van het type T2 met één element. Indien nodig wordt de scalaire waarde geconverteerd naar type T2 met behulp van de conversieregels van deze sectie.
  • Als het parametertype een ander scalaire type is dan object en het argument een verzameling is, is het argument een fout.
  • Als het verwachte parametertype een verzameling van het type T2 is en het argument een verzameling van het type T1 is, wordt het argument geconverteerd naar een verzameling van het type T2 met dezelfde lengte als de argumentverzameling. Indien nodig worden de waarden van het argumentverzamelingselement geconverteerd naar type T2 met behulp van de conversieregels van deze sectie.
  • Als de bovenstaande stappen en de eerder in dit hoofdstuk opgegeven conversies niet voldoen, worden de regels in #6.18 toegepast. Als deze mislukken, mislukt de parameterbinding.

6.18 .NET-conversie

Voor een impliciete conversie worden de ingebouwde conversies van PowerShell eerst geprobeerd. Als ze de conversie niet kunnen omzetten, worden de onderstaande aangepaste .NET-conversieprogramma's geprobeerd, in volgorde, van boven naar beneden. Als er een conversie wordt gevonden, maar er een uitzondering wordt genereren, is de conversie mislukt.

  • PSTypeConverter: er zijn twee manieren om de implementatie van de PSTypeConverter-klasse te koppelen aan de doelklasse: via het typeconfiguratiebestand (types.ps1xml) System.ComponentModel.TypeConverterAttribute of door het kenmerk toe te passen op de doelklasse. Raadpleeg de PowerShell SDK-documentatie voor meer informatie.

  • TypeConverter: Dit CLR-type biedt een uniforme manier om typen waarden te converteren naar andere typen, evenals voor toegang tot standaardwaarden en subeigenschappen. Het meest voorkomende type converter is een conversie naar en van een tekstweergave. Het type converter voor een klasse is gebonden aan de klasse met een System.ComponentModel.TypeConverterAttribute. Tenzij dit kenmerk wordt overschrijven, gebruiken alle klassen die overnemen van deze klasse hetzelfde type converter als de basisklasse. Raadpleeg de PowerShell SDK en de documentatie Microsoft .NET framework voor meer informatie.

  • Methode parseren: als het brontype tekenreeks is Parseen het doeltype een methode heeft met de naam , wordt die methode aangeroepen om de conversie uit te voeren.

  • Constructors: als het doeltype een constructor heeft met één argument waarvan het type dat van het brontype is, wordt die constructor aangeroepen om de conversie uit te voeren.

  • Impliciete cast-operator: als het brontype een impliciete cast-operator heeft die naar het doeltype converteert, wordt die operator aangeroepen om de conversie uit te voeren.

  • Expliciete cast-operator: als het brontype een expliciete cast-operator heeft die naar het doeltype converteert, wordt die operator aangeroepen om de conversie uit te voeren. Als het doeltype een expliciete cast-operator heeft die converteert van het brontype, wordt die operator aangeroepen om de conversie uit te voeren.

  • IConvertable: wordt System.Convert.ChangeType aangeroepen om de conversie uit te voeren.

6.19 Conversie naar besteld

De regels voor het converteren van een waarde naar het pseudotype geordend zijn als volgt:

  • Als de waarde een hash-letterlijke waarde (2.3.5.6) is, is het resultaat een object met een gedefinieerd implementatietype dat zich gedraagt als een hashtabel en de volgorde van de sleutels overeenkomt met de volgorde die is opgegeven in de hash-letterlijke waarde.
  • Anders is het gedrag implementatie gedefinieerd.

Alleen hash-letterlijke cijfers (2.3.5.6) kunnen worden geconverteerd naar geordend. Het resultaat is een exemplaar van System.Collections.Specialized.OrderedDictionary.

6.20 Conversie naar pscustomobject

De regels voor het converteren van een waarde naar het pseudo-type pscustomobject zijn als volgt:

  • Een waarde van het type hashtabel wordt geconverteerd naar een PowerShell-object. Elke sleutel in de hashtabel wordt een NoteProperty met de bijbehorende waarde.
  • Anders is het gedrag implementatie gedefinieerd.

De conversie is altijd toegestaan, maar wijzigt het type van de waarde niet.