6. Konverteringar

En typkonvertering utförs när ett värde av en typ används i en kontext som kräver en annan typ. Om en sådan konvertering sker automatiskt kallas den för implicit konvertering. (Ett vanligt exempel på detta är med vissa operatorer som behöver konvertera ett eller flera av de värden som anges av deras operander.) Implicit konvertering tillåts förutsatt att källvärdets betydelse bevaras, till exempel ingen förlust av precision för ett tal när det konverteras.

Omvandlingsoperatorn (·7.2.9) tillåter explicit konvertering.

Konverteringarna beskrivs nedan med kompletterande information som tillhandahålls vid behov i beskrivningen av varje operator i -6.19.

Explicit konvertering av ett värde till den typ som det redan har orsakar ingen ändring av det värdet eller dess representation.

Reglerna för handskriftskonvertering när värdet för ett uttryck binds till en parameter täcks i -6.17.

6.1 Konvertering till void

Ett värde av vilken typ som helst kan tas bort explicit genom att den typas till void. Det finns inget resultat.

6.2 Konvertering till bool

Reglerna för att konvertera ett värde till typen bool är följande:

  • Ett numeriskt värde eller ett teckenvärde på noll konverteras till False. ett numeriskt värde eller ett teckenvärde som inte är noll konverteras till Sant.
  • Värdet null konverteras till Falskt.
  • En sträng med längden 0 konverteras till False. en sträng med längden > 0 konverteras till Sant.
  • En växlingsparameter med $true värdet konverteras till True och en med värdet $false konverteras till False.
  • Alla andra referenstypsvärden som inte är null konverteras till True.

Om typen implementerar IList:

  • Om objektets Längd > 2 konverteras värdet till Sant.
  • Om objektets Längd är 1 och det första elementet inte själv är en IList konverteras värdet till Sant om elementets värde är sant.
  • Om det första elementets Antal är >= 1 konverteras värdet till Sant.
  • Annars konverteras värdet till False.

6.3 Konvertering till char

Reglerna för att konvertera ett värde till typen char är följande:

  • Konverteringen av ett värde av typen bool, decimal, flyttal eller double är ett fel.
  • Värdet null konverteras till nulltecknet (U+0000).
  • Ett heltalstypvärde vars värde kan representeras i typen char har det värdet. Annars är konverteringen fel.
  • Konverteringen av ett strängvärde med en annan längd än 1 är ett fel.
  • Ett strängvärde med längden 1 konverteras till ett tecken med det tecknets värde.
  • Ett numeriskt typvärde vars värde efter avrundning av någon bråkdel kan representeras i måltypen har det avrundade värdet. Annars är konverteringen fel.
  • Om referenstypen stöder en sådan konvertering för andra referenstypvärden används den konverteringen. Annars är konverteringen fel.

6.4 Konvertering till heltal

Reglerna för att konvertera ett värde till typen byte, int eller long är följande:

  • Bool-värdet False konverteras till noll. bool-värdet True konverteras till 1.
  • Ett teckentypvärde vars värde kan representeras i måltypen har det värdet. Annars är konverteringen fel.
  • Ett numeriskt typvärde vars värde efter avrundning av någon bråkdel kan representeras i måltypen har det avrundade värdet. Annars är konverteringen fel.
  • Värdet null konverteras till noll.
  • En sträng som representerar ett tal konverteras enligt beskrivningen i 6,16. Om resultatet kan representeras i måltypen efter trunkering av bråkdelen är strängen väl utformad och har måltypen. Annars är konverteringen fel. Om strängen inte representerar ett tal är konverteringen fel.
  • Om referenstypen stöder en sådan konvertering för andra referenstypvärden används den konverteringen. Annars är konverteringen fel.

6.5 Konvertering till flyttal och double

Reglerna för att konvertera ett värde till typen float eller double är följande:

  • Bool-värdet False konverteras till noll. bool-värdet True konverteras till 1.
  • Ett char-värde representeras exakt.
  • Ett numeriskt typvärde representeras exakt, om möjligt. Men för int-, long- och decimalkonverteringar till flyttal, och för långa och decimalkonverteringar som ska dubblas, kan vissa av de minst signifikanta bitarna av heltalsvärdet gå förlorade.
  • Värdet null konverteras till noll.
  • En sträng som representerar ett tal konverteras enligt beskrivningen i 6,16. Annars är konverteringen fel.
  • Om referenstypen stöder en sådan konvertering för andra referenstypvärden används den konverteringen. Annars är konverteringen fel.

6.6 Konvertering till decimal

Reglerna för att konvertera ett värde till typen decimal är följande:

  • Bool-värdet False konverteras till noll. bool-värdet True konverteras till 1.
  • Ett teckentypvärde representeras exakt.
  • Ett numeriskt typvärde representeras exakt. Men om det värdet är för stort eller för litet för att få plats i måltypen är konverteringen fel.
  • Värdet null konverteras till noll.
  • En sträng som representerar ett tal konverteras enligt beskrivningen i 6,16. Annars är konverteringen fel.
  • Om referenstypen stöder en sådan konvertering för andra referenstypvärden används den konverteringen. Annars är konverteringen fel.
  • Skalan för resultatet av en lyckad konvertering är så att bråkdelen inte har några avslutande nollor.

6.7 Konvertering till objekt

Värdet för alla typer utom null-typen (4.1.2) kan konverteras till typobjekt. Värdet behåller sin typ och representation.

6.8 Konvertering till sträng

Reglerna för att konvertera ett värde till en strängtyp är följande:

  • Bool-värdet $false konverteras till "False". Bool-värdet $true konverteras till "True".
  • Ett teckentypvärde konverteras till en sträng på 1 tecken som innehåller det tecknet.
  • Ett värde av numerisk typ konverteras till en sträng som har formen av en motsvarande numerisk literal. Resultatet har dock inga inledande eller avslutande blanksteg, inget inledande plustecken, heltal har base 10 och det finns inget typsuffix. För en decimalkonvertering bevaras skalan. För värdena -∞, +∞ och NaN är de resulterande strängarna "-Infinity", "Infinity" respektive "NaN".
  • Värdet null konverteras till den tomma strängen.
  • För en 1-dimensionell matris är resultatet en sträng som innehåller värdet för varje element i matrisen, från början till slut, konverterat till sträng, där element avgränsas av den aktuella utdatafältavgränsaren (!)2.3.2.2). För en matris som har element som själva är matriser konverteras endast de översta elementen. Den sträng som används för att representera värdet för ett element som är en matris är implementeringsdefinierad. För en flerdimensionell matris plattas den ut (9.12) och behandlas sedan som en 1-dimensionell matris.
  • Värdet null konverteras till den tomma strängen.
  • Ett scriptblock-typvärde konverteras till en sträng som innehåller texten i det blocket utan de avgränsande { och } tecknen.
  • För ett uppräkningstypvärde är resultatet en sträng som innehåller namnet på varje uppräkningskonstant kodad i det värdet, avgränsat med kommatecken.
  • Om referenstypen stöder en sådan konvertering för andra referenstypvärden används den konverteringen. Annars är konverteringen fel.

Strängen som används för att representera värdet för ett element som är en matris har formen System.type[], System.type[,]och så vidare. För andra referenstyper anropas ToString metoden . För andra uppräkningsbara typer behandlas källvärdet som en 1-dimensionell matris.

6.9 Konvertering till matris

Reglerna för att konvertera ett värde till en matristyp är följande:

  • Måltypen kanske inte är en flerdimensionell matris.
  • Värdet null behålls som det är.
  • För ett annat skalära $null värde än eller ett värde av typen hash-tabell skapas en ny 1-elementmatris vars värde är skalären efter konverteringen till målelementtypen.
  • För ett 1-dimensionellt matrisvärde skapas en ny matris av måltypen och varje element kopieras med konvertering från källmatrisen till motsvarande element i målmatrisen.
  • För ett flerdimensionellt matrisvärde plattas matrisen först ut (–9,12) och behandlas sedan som ett 1-dimensionellt matrisvärde.
  • Ett strängvärde konverteras till en matris med tecken med samma längd med efterföljande tecken från strängen som upptar motsvarande positioner i matrisen.

För andra uppräkningsbara typer skapas en ny 1-elementmatris vars värde är motsvarande element efter konverteringen till målelementtypen, om en sådan konvertering finns. Annars är konverteringen fel.

6.10 Konvertering till xml

Objektet konverteras till typsträng och sedan till ett XML-dokumentobjekt av typen xml.

6.11 Konvertering till regex

Ett uttryck som anger ett värde av typen sträng kan konverteras till typen regex.

6.12 Konvertering till scriptblock

Reglerna för att konvertera ett värde till typ scriptblock är följande:

  • Ett strängvärde behandlas som namnet på ett kommando som eventuellt följer med argument till ett anrop till det kommandot.

6.13 Konvertering till uppräkningstyper

Reglerna för att konvertera ett värde till en uppräkningstyp är följande:

  • Ett värde av typen sträng som innehåller ett av de namngivna värdena (med hänsyn till fallet) för en uppräkningstyp konverteras till det namngivna värdet.
  • Ett värde av typen sträng som innehåller en kommaavgränsad lista med namngivna värden (med hänsyn till fallet) för en uppräkningstyp konverteras till bitwise-OR för alla namngivna värden.

6.14 Konvertering till andra referenstyper

Reglerna för att konvertera ett värde till en annan referenstyp än en matristyp eller sträng är följande:

  • Värdet null behålls som det är.
  • Annars definieras beteendet som implementering.

Här spelar vi in ett antal maskindelar. Dessa omfattar möjlig användning av konstruktorer för enskilda argument eller standardkonstruktorer om värdet är en hash-tabell, implicita och explicita konverteringsoperatorer och parsningsmetoder för måltypen. användning av Convert.ConvertTo; och ETS-konverteringsmekanismen.

6.15 Vanliga aritmetiska konverteringar

Om ingen operand anger ett värde som har numerisk typ,

  • Om den vänstra operanden anger ett värde av typen bool visas konverteringen som ett fel.
  • Annars konverteras alla operander $null som anger värdet till noll av typen int och processen fortsätter med de numeriska konverteringarna som anges nedan.
  • Om den vänstra operanden i annat fall anger ett värde av typen char och den högra operanden anger ett värde av typen bool är konverteringen fel.
  • Om den vänstra operanden i annat fall anger ett värde av typen sträng men inte representerar ett tal (6,16) är konverteringen fel.
  • Om den högra operanden i annat fall anger ett värde av typen sträng men inte representerar ett tal (6,16) är konverteringen fel.
  • Annars konverteras alla operander som anger värden av typen sträng till tal (#6.16) och processen fortsätter med de numeriska konverteringarna som anges nedan.
  • Annars är konverteringen fel.

Numeriska konverteringar:

  • Om en operand anger ett värde av typen decimal konverteras det värde som anges av den andra operanden till den typen, om det behövs. Resultatet har typen decimal.
  • Om en operand i annat fall anger ett värde av typen double konverteras värdet som anges av den andra operanden till den typen, om det behövs. Resultatet har typen double.
  • Annars, om en operand anger ett värde av typen flyttal, konverteras de värden som anges av båda operanderna till typen double, om det behövs. Resultatet har typen double.
  • Om en operand i annat fall anger ett värde av typen long konverteras värdet som anges av det andra operandvärdet till den typen, om det behövs. Resultatet har typen först i sekvensen long och double som kan representera dess värde.
  • Annars konverteras de värden som anges av båda operanderna till typ int, om det behövs. Resultatet har det första i sekvensen int, long, double, som kan representera dess värde utan trunkering.

6.16 Konvertering från sträng till numerisk typ

Beroende på dess innehåll kan en sträng konverteras explicit eller implicit till ett numeriskt värde. Mer specifikt:

  • En tom sträng konverteras till värdet noll.
  • Inledande och avslutande blanksteg ignoreras. En sträng får dock inte bestå av enbart blanksteg.
  • En sträng som endast innehåller blanksteg och/eller radterminatorer konverteras till värdet noll.
  • Ett inledande + eller – tecken tillåts.
  • Ett heltalsnummer kan ha ett hexadecimalt prefix (0x eller 0X).
  • En eventuellt signerad exponent tillåts.
  • Typsuffix och multiplikatorer tillåts inte.
  • De skiftande strängarna "-Infinity", "Infinity" och "NaN" identifieras som värdena -∞, +∞ respektive NaN.

6.17 Konvertering under parameterbindning

Information om parameterbindning finns i .8.14.

När värdet för ett uttryck binds till en parameter finns det extra konverteringsöverväganden, enligt beskrivningen nedan:

  • Om parametertypen är bool eller switch (·4.2.5, 8.10.5) och parametern inte har något argument anges värdet för parametern i det anropade kommandot till $true. Om parametertypen är annan än bool eller switch uppstår ett fel för en parameter som inte har något argument.
  • Om parametertypen är switch och argumentvärdet är $nullanges parametervärdet till $false.
  • Om parametertypen är objekt eller är samma som typen av argument skickas argumentets värde utan konvertering.
  • Om parametertypen inte är objekt eller scriptblock utvärderas ett argument med typen scriptblock och dess resultat skickas som argumentets värde. (Detta kallas för fördröjd bindning av skriptblock.) Om parametertypen är objekt eller scriptblock skickas ett argument med typen scriptblock som det är.
  • Om parametertypen är en samling av typen T2 och argumentet är en skalär av typen T1 konverteras den skalären till en samling av typen T2 som innehåller ett element. Vid behov konverteras det skalära värdet till typ T2 med hjälp av konverteringsreglerna i det här avsnittet.
  • Om parametertypen är en annan skalära typ än -objektet och argumentet är en samling är argumentet i fel.
  • Om den förväntade parametertypen är en samling av typen T2 och argumentet är en samling av typen T1 konverteras argumentet till en samling av typen T2 med samma längd som argumentsamlingen. Vid behov konverteras argumentsamlingselementvärdena till typ T2 med hjälp av konverteringsreglerna i det här avsnittet.
  • Om stegen ovan och de konverteringar som angavs tidigare i det här kapitlet inte räcker till tillämpas reglerna i 6,18 . Om dessa misslyckas misslyckas parameterbindningen.

6.18 .NET-konvertering

För en implicit konvertering provas först PowerShells inbyggda konverteringar. Om de inte kan lösa konverteringen provas de anpassade .NET-konverterarna nedan, i ordning, uppifrån och ned. Om en konvertering hittas, men den löste ett undantag, har konverteringen misslyckats.

  • PSTypeConverter: Det finns två sätt att associera implementeringen av klassen PSTypeConverter med dess målklass: via typkonfigurationsfilen (types.ps1xml) eller genom att tillämpa System.ComponentModel.TypeConverterAttribute attributet på målklassen. Mer information finns i PowerShell SDK-dokumentationen.

  • TypeConverter: Den här CLR-typen ger ett enhetligt sätt att konvertera typer av värden till andra typer, samt för åtkomst till standardvärden och underegenskaper. Den vanligaste typen av konverterare är en som konverterar till och från en textrepresentation. Typkonverteraren för en klass är bunden till klassen med en System.ComponentModel.TypeConverterAttribute. Om inte det här attributet åsidosätts använder alla klasser som ärver från den här klassen samma typkonverterare som basklassen. Mer information finns i Dokumentationen för PowerShell SDK Microsoft .NET ramverket.

  • Parsningsmetod: Om källtypen är sträng Parseoch måltypen har en metod som heter anropas den metoden för att utföra konverteringen.

  • Konstruktorer: Om måltypen har en konstruktor som tar ett enda argument vars typ är källtypen anropas konstruktorn för att utföra konverteringen.

  • Implicit typkonverteringsoperator: Om källtypen har en implicit typkonverteringsoperator som konverteras till måltypen anropas den operatorn för att utföra konverteringen.

  • Explicit typkonverteringsoperator: Om källtypen har en explicit typkonverteringsoperator som konverteras till måltypen anropas den operatorn för att utföra konverteringen. Om måltypen har en explicit typkonverteringsoperator som konverterar från källtypen anropas den operatorn för att utföra konverteringen.

  • IConvertable: System.Convert.ChangeType anropas för att utföra konverteringen.

6.19 Konvertering till sorterad

Reglerna för att konvertera ett värde till den beställda pseudotypen är följande:

  • Om värdet är en hash-literal (–2.3.5.6) är resultatet ett objekt med en implementeringsdefinierad typ som fungerar som en hash-tabell och ordningen på nycklarna matchar ordningen som anges i hash-literalen.
  • Annars definieras beteendet som implementering.

Endast hash-literaler (·2.3.5.6) kan konverteras till sorterade. Resultatet är en instans av System.Collections.Specialized.OrderedDictionary.

6.20 Konvertering till pscustect

Reglerna för att konvertera ett värde till pseudotypen pscustbject är följande:

  • Ett värde av typen hashtable konverteras till ett PowerShell-objekt. Varje nyckel i hash-tabellen blir en NoteProperty med motsvarande värde.
  • Annars definieras beteendet som implementering.

Konverteringen tillåts alltid, men ändrar inte värdets typ.