6. Átalakítások

Típuskonverzió akkor történik, ha egy típusú értéket más típust igénylő környezetben használnak. Ha egy ilyen átalakítás automatikusan megtörténik, implicit konverziónak nevezik. (Erre gyakori példa néhány olyan operátor, amelyek az operandusaik által kijelölt egy vagy több értéket konvertálják.) Az implicit konverzió akkor engedélyezett, ha a forrásérték értelme megmarad, például nincs szükség a szám pontosságának elvesztésére az átalakításkor.

Az explicit konverziót az explicit konverzió lehetővé teszi az explicit konverziót az explicit operátorral (a 7.2.9-es operátorral).

Az átalakításokat alább tárgyaljuk, és az egyes operátorok leírásában szükség szerint kiegészítő információkat is meg kell adni a .6.19-es számban.

Egy érték explicit átalakítása a már tartalmazott típusra nem módosítja ezt az értéket vagy annak ábrázolását.

A konverziós szabályokra, amikor egy kifejezés értéke egy paraméterhez van kötve, a 6.17-es cikk fedi le.

6.1 Érvénytelenítés

Bármilyen típusú érték elvethet explicit módon, ha úgy adja meg, hogy void típusú legyen. Nincs eredmény.

6.2 Átalakítás boolra

Az értékek bool típusra való konvertálásának szabályai a következők:

  • A nullát tartalmazó numerikus vagy karakterérték hamisra lesz konvertálva; a nem nulla numerikus vagy karakterérték igazra lesz konvertálva.
  • A null típusú érték false (Hamis) értékre lesz konvertálva.
  • A 0 hosszúságú sztring false (Hamis) lesz; A 0> hosszúságú sztring igazra lesz konvertálva.
  • Az értékkel egy kapcsolóparaméter $true igazra, egy értékkel $false pedig False (Hamis) értékre van konvertálva.
  • A többi nem null értékű referenciatípus igazra lesz konvertálva.

Ha a típus megvalósítja az IListet:

  • Ha az objektum Length értéke 2>, az érték True (Igaz) értékre lesz konvertálva.
  • Ha az objektum Length értéke 1, és az első elem maga nem IList, akkor ha az elem értéke igaz, a rendszer True (Igaz) értékre konvertálja az értéket.
  • Ellenkező esetben, ha az első elem Count (Darabszám) értéke >= 1, az érték True (Igaz) értékre lesz konvertálva.
  • Ellenkező esetben a érték False (Hamis) lesz.

6.3 Átalakítás karakterre

Bármely érték karakter típusúra konvertálásának szabályai a következők:

  • Egy bool, decimális, lebegőpontos vagy dupla típusú érték konvertálása hibás.
  • A null típusú érték null (U+0000) karakterre lesz konvertálva.
  • Egy olyan egész szám típusú érték, amelynek értéke karakterrel ábrázolható, rendelkezik ezzel az értékkel; Ellenkező esetben az átalakítás hibás.
  • Az 1-től különböző hosszúságú sztringértékek átalakítása hibás.
  • Az 1 hosszúságú sztringértékek az egy karakter értékével rendelkező karakterre vannak konvertálva.
  • Egy numerikus típusú érték, amelynek bármely törtrész kerekítés utáni értéke ábrázolható a céltípusban, a kerekített értékkel rendelkezik; Ellenkező esetben az átalakítás hibás.
  • Ha más referenciatípus-értékek esetén a referenciáltípus támogatja ezt az átalakítást, akkor a rendszer ezt az átalakítást használja; Ellenkező esetben az átalakítás hibás.

6.4 Átalakítás egész számra

Az értékek bájt, int vagy hosszú típusra konvertálásának szabályai a következők:

  • A hamis bool érték nullára lesz konvertálva; a true bool érték 1-re lesz konvertálva.
  • A céltípusban ábrázolható karakter típusú érték rendelkezik ezzel az értékkel; Ellenkező esetben az átalakítás hibás.
  • Egy numerikus típusú érték, amelynek bármely törtrész kerekítés utáni értéke ábrázolható a céltípusban, a kerekített értékkel rendelkezik; Ellenkező esetben az átalakítás hibás.
  • A null típusú érték nullára lesz konvertálva.
  • A számot képviselő sztring a -6.16 dokumentumban leírtak szerint lesz konvertálva. Ha a törtrész csonkítását követően az eredmény a céltípusban is ábrázolható, a sztring jól formázott és céltípussal rendelkezik; Ellenkező esetben az átalakítás hibás. Ha a sztring nem számot képvisel, az átalakítás hibás.
  • Ha más referenciatípus-értékek esetén a referenciáltípus támogatja ezt az átalakítást, akkor a rendszer ezt az átalakítást használja; Ellenkező esetben az átalakítás hibás.

6.5 Konverzió lebegő és dupla

Az értékek lebegő vagy dupla típusúra konvertálásának szabályai a következők:

  • A hamis bool érték nullára lesz konvertálva; a true bool érték 1-re lesz konvertálva.
  • A karakterértékek pontosan ábrázolva vannak.
  • A numerikus típusú érték pontosan, ha lehetséges; az int, long és decimális értékek lebegőpontosra konvertálása, valamint a hosszú és a decimális konverziók duplájára konvertálása során azonban az egész szám értékének néhány legkevésbé jelentős bite elveszhet.
  • A null típusú érték nullára lesz konvertálva.
  • A számot képviselő sztring a következő dokumentumban leírt módon lesz konvertálva: .6.16; Ellenkező esetben az átalakítás hibás.
  • Ha más referenciatípus-értékek esetén a referenciáltípus támogatja ezt az átalakítást, akkor a rendszer ezt az átalakítást használja; Ellenkező esetben az átalakítás hibás.

6.6 Átalakítás decimálisra

Az értékek decimális típusra való konvertálásának szabályai a következők:

  • A hamis bool érték nullára lesz konvertálva; a true bool érték 1-re lesz konvertálva.
  • A karaktertípus-érték pontosan van ábrázolva.
  • A numerikus típusú érték pontosan van ábrázolva; ha azonban ez az érték túl nagy vagy túl kicsi ahhoz, hogy elférjen a céltípusban, az átalakítás hibás.
  • A null típusú érték nullára lesz konvertálva.
  • A számot képviselő sztring a következő dokumentumban leírt módon lesz konvertálva: .6.16; Ellenkező esetben az átalakítás hibás.
  • Ha más referenciatípus-értékek esetén a referenciáltípus támogatja ezt az átalakítást, akkor a rendszer ezt az átalakítást használja; Ellenkező esetben az átalakítás hibás.
  • A sikeres átalakítás eredményének skálája olyan, hogy a törtrész nem rendelkezik záró nullával.

6.7 Objektumra konvertálás

A null típuson (4.1.2) kívül bármely típus érték konvertálható objektum típusúvá. Az érték megtartja a típusát és ábrázolását.

6.8 Sztringre konvertálás

Bármely érték sztring típusúra konvertálásának szabályai a következők:

  • A bool érték $false "False" (Hamis) értékre lesz konvertálva; a bool $true értéke "True" (Igaz) értékre lesz konvertálva.
  • A karaktertípus-érték egy 1 karakterből áll sztringgé lesz konvertálva, amely tartalmazza ezt a karaktert.
  • A numerikus típusú értékeket a rendszer egy megfelelő numerikus literál formájában megadott sztringgé alakítja. Az eredményben azonban nincsenek kezdő vagy záró szóközök, nincs kezdő pluszjel, az egész számnak 10-es az alapvonala, és nincs típus utótagja. Decimális konverzióhoz a rendszer megőrzi a skálát. A -∞, a +∞ és a NaN értékek esetén az eredményül kapott sztringek a "-Infinity", "Infinity" és "NaN".
  • A null típusú érték üres sztringgé lesz konvertálva.
  • Egy 1 dimenziós tömb esetén az eredmény egy sztring, amely a tömb egyes elemeinek értékét tartalmazza, az elsőtől a végéig, sztringgé konvertálva, és az elemeket az aktuális kimeneti mezőelválasztó (").2.3.2.2) választja el egymástól. Olyan tömbök esetén, amelyek maguk is tömbök, csak a legfelső szintű elemek konvertálhatók. A tömb típusú elemek értékét képviselő sztring definiálva van. Többdimenziós tömbökben a rendszer simítottként ($9,12) kezeli őket, majd 1 dimenziós tömbként kezeli őket.
  • A null típusú érték üres sztringgé lesz konvertálva.
  • A scriptblock típusú érték a blokk szövegét tartalmazó sztringgé lesz konvertálva a tagolt { és } karakter nélkül.
  • Az enumerációs típus érték esetén az eredmény egy sztring, amely az adott értékben kódolt összes enumerációs állandó nevét tartalmazza, vesszővel elválasztva.
  • Ha más referenciatípus-értékek esetén a referenciáltípus támogatja ezt az átalakítást, akkor a rendszer ezt az átalakítást használja; Ellenkező esetben az átalakítás hibás.

A tömbként System.type[]megadott elemek értékét képviselő sztring formája , System.type[,]és így tovább. Más referenciák esetében a metódus ToString neve. Más enumerable típusok esetén a forrásértéket 1 dimenziós tömbként kezeli a rendszer.

6.9 Tömbre konvertálás

Az érték tömb típusúvá konvertálásának szabályai a következők:

  • A céltípus nem lehet többdimenziós tömb.
  • A null típusú értékek a megadott megőrzési értékkel maradnak meg.
  • A vagy a típusú kivonattáblától különböző skaláris értékekhez egy új, 1 elemből áll tömb jön létre, amelynek értéke a skaláris $null érték a célelemtípusra való átalakítás után.
  • Egy 1 dimenziós tömbértékhez létrejön a céltípus új tömbje, és a rendszer minden elemet a forrástömbből a céltömb megfelelő elemének átalakításával másol.
  • A többdimenziós tömbértékek első lépése a tömb el simítása (azaz 9,12), majd 1 dimenziós tömbértékként való kezelése.
  • A sztringértékek azonos hosszúságú karaktertömbökké alakulnak, és egymást követő karaktereket tartalmaznak a tömb megfelelő pozíciói között.

Más enumerable típusok esetén létrejön egy új, 1 elemből álló tömb, amelynek értéke a célelemtípusra való átalakítás utáni megfelelő elem, ha létezik ilyen átalakítás. Ellenkező esetben az átalakítás hibás.

6.10 Átalakítás xml formátumba

A objektum sztring típusúvá, majd típusú XML-dokumentumobjektumká lesz konvertálva xml.

6.11 Átalakítás regexre

A sztring típusú értéket megszabadó kifejezések típusra konvertálhatók regex.

6.12 Átalakítás scriptblockra

Az érték típusra konvertálásának szabályai scriptblock a következők:

  • A sztringértéket a parancs neveként kell kezelni, opcionálisan az adott parancs hívásának argumentumai által.

6.13 Enumerálástípusokra konvertálás

Az értékek enumerálás típusúvá konvertálásának szabályai a következők:

  • A típus sztring típusú értéke, amely az enumerálás típusának egyik nevest (a kis- és a kis- és a nagy- és nagy- és sztringekat is figyelembe véve) az adott névvel megadott értékre lesz konvertálva.
  • Az enumerálás típusához vesszővel elválasztott névvel elválasztott értéklistát tartalmazó sztring típusú értékeket a rendszer az összes elnevezett érték bitwise-OR értékké alakítja.

6.14 Átalakítás más referenciákra

Az értékek tömbtípustól vagy sztringtől más referenciára konvertálásának szabályai a következők:

  • A null típusú értékek a megadott értéken maradnak meg.
  • Ellenkező esetben a viselkedés implementációja definiálva lesz.

Itt több gép is szerepet játszik; ezek közé tartozik az egy argumentumot kezelő konstruktorok vagy az alapértelmezett konstruktorok használata, ha az érték kivonattábla, implicit és explicit konverziós operátor, valamint a céltípushoz használható elemzési metódusok; a Convert.ConvertTo használata; és az ETS konverziós mechanizmust.

6.15 Szokásos aritmetikai konverziók

Ha egyik operandus sem jelöl ki numerikus típusú értéket, akkor

  • Ha a bal oldali operandus bool típusú értéket jelöl ki, az átalakítás hibás.
  • Ellenkező esetben az értéket megtervező összes operandus $null int típusúra lesz konvertálva, és a folyamat az alább felsorolt numerikus átalakításokkal folytatódik.
  • Ellenkező esetben, ha a bal oldali operandus a char típusú értéket jelöli, a jobb oldali operandus pedig bool típusú értéket, akkor az átalakítás hibás.
  • Ellenkező esetben, ha a bal oldali operandus sztring típusú értéket jelöl, de nem számot (azaz 6,16), az átalakítás hibás.
  • Ellenkező esetben, ha a jobb operandus sztring típusú értéket jelöl, de nem számot (azaz 6,16), az átalakítás hibás.
  • Ellenkező esetben a sztring típusú értékeket megtervező összes operandus számokká lesz konvertálva (*6.16), és a folyamat az alább felsorolt numerikus átalakításokkal folytatódik.
  • Ellenkező esetben az átalakítás hibás.

Numerikus átalakítások:

  • Ha az egyik operandus decimális típusú értéket jelöl, a másik által kijelölt érték szükség esetén erre a típusra lesz konvertálva. Az eredmény típus decimális.
  • Ellenkező esetben, ha az egyik operandus kettős típusú értéket jelöl ki, a másik által kijelölt érték szükség esetén erre a típusra lesz konvertálva. Az eredmény típusa double.
  • Ellenkező esetben, ha egy operandus lebegő típusú értéket jelöl ki, a két operandus által kijelölt értékek szükség esetén double típusúvá alakulnak át. Az eredmény típusa double.
  • Ellenkező esetben, ha az egyik operandus hosszú értéket jelöl ki, a másik operandus által kijelölt érték szükség esetén erre a típusra lesz konvertálva. Az eredmény típusa a hosszú sorozat első típusa, a dupla pedig az értékét ábrázolja.
  • Ellenkező esetben a két operandus által kijelölt értékek szükség esetén int típusra vannak konvertálva. Az eredményben az első a sorozat int ( hosszú, dupla) értéke, amely csonkítás nélkül ábrázolhatja az értékét.

6.16 Átalakítás sztringről numerikus típusra

A sztring tartalmatól függően explicit módon vagy implicit módon numerikus értékké konvertálható. Ezek:

  • Az üres sztringek nullára alakulnak át.
  • A kezdő és záró szóközöket a rendszer figyelmen kívül hagyja; A sztringek azonban nem állhatnak csak szóközökből.
  • A csak térközt és/vagy sorterminátorokat tartalmazó sztringek nulla értékre konvertálhatók.
  • Egy kezdő + vagy - jel használata engedélyezett.
  • Az egész szám hexadecimális előtaggal (0x vagy 0X) is lehet.
  • A nem kötelezően aláírt kitevők használata engedélyezett.
  • A típus-utótagok és a szorzók nem engedélyezettek.
  • A kis- és ∞, a +∞ és a NaN értékként ismeri fel a rendszer a kis- és ∞ sztringeket.

6.17 Átalakítás paraméterkötés során

For information about parameter binding see §8.14.

Ha egy kifejezés értéke egy paraméterhez van kötve, további konverziós szempontokat kell figyelembe venni az alábbiak szerint:

  • Ha a paraméter típusa bool vagy switch (ér 4.2.5, .8.10.5), és a paraméternek nincs argumentuma, $truea nevű parancs paraméterének értéke . Ha a paraméter típusa nem bool vagy switch, akkor egy argumentumot nem rendelkező paraméter hibás.
  • Ha a paraméter típusa switch, az argumentum értéke $nullpedig , a paraméter értéke $false.
  • Ha a paraméter típusa objektum, vagy megegyezik az argumentum típusának típussal, akkor az argumentum értéke átalakítás nélkül lesz átadva.
  • Ha a paraméter típusa nem objektum vagy scriptblock, a rendszer kiértékel egy scriptblock típusú argumentumot, és annak eredményét adja át az argumentum értékeként. (Ezt késleltetett szkriptblokk-kötésnek nevezik.) Ha a paraméter típusa object vagy scriptblock, akkor a scriptblock típusú argumentumot a rendszer a megadott ként adja át.
  • Ha a paraméter típusa T2 típusú gyűjtemény, az argumentum pedig T1 típusú skaláris, akkor a skaláris típus t2 típusú gyűjteményré lesz konvertálva, amely egy elemet tartalmaz. Szükség esetén a skaláris érték T2 típusra lesz konvertálva a szakasz átalakítási szabályaival.
  • Ha a paraméter típusa nem objektum, és az argumentum egy gyűjtemény, akkor az argumentum hibás.
  • Ha a várt paramétertípus egy T2 típusú gyűjtemény, az argumentum pedig T1 típusú gyűjtemény, az argumentum T2 típusú gyűjteményre lesz konvertálva, amelynek hossza megegyezik az argumentumgyűjtemény hosszával. Ha szükséges, az argumentumgyűjtemény elemértékeit a rendszer T2 típusra konvertálja a szakasz átalakítási szabályaival.
  • Ha a fenti lépések és a fejezet korábbi részében megadott átalakítások nem elégségesek, a rendszer alkalmazza a (6,18 ) számú szabályt. Ha ezek nem sikerülnek, a paraméterkötés sikertelen lesz.

6.18 .NET-konverzió

Implicit konverzióhoz először a PowerShell beépített konverzióit próbáljuk ki. Ha nem tudják feloldani az átalakítást, az alábbi egyéni .NET-átalakítók felülről lefelé próbálnak, sorrendben. Ha a rendszer talál egy konverziót, de kivételt ad vissza, az átalakítás sikertelen volt.

  • PSTypeConverter: A PSTypeConverter osztály implementációját kétféleképpen lehet a célosztályhoz társítani: a típuskonfigurációs fájllal (types.ps1xml), System.ComponentModel.TypeConverterAttribute vagy a attribútum célosztályra való alkalmazásával. További információért tekintse meg a PowerShell SDK dokumentációját.

  • TypeConverter: Ez a CLR-típus egységes módban konvertálja az értéktípusokat más típusokká, valamint a standard értékek és altulajdonságok elérésére. Az átalakító leggyakoribb típusa az, amely szöveges ábrázolásból és típusra konvertál. Az osztály típusátalakítója a osztályhoz van kötve a következővel: System.ComponentModel.TypeConverterAttribute. Ha ez az attribútum nincs felülbírálva, az osztályból örökölt összes osztály ugyanazt a típusátalakítót használja, mint az alaposztály. További információért tekintse meg a PowerShell SDK Microsoft .NET és a Microsoft .NET keretrendszer dokumentációját.

  • Elemzési metódus: Ha a forrás típusa sztring, és a céltípus egy nevű metódussal rendelkezik, a rendszer ezt a Parsemetódust hívja meg az átalakítás végrehajtásához.

  • Konstruktorok: Ha a céltípus egyetlen argumentumot vesz fel, amelynek típusa a forrástípusé, a rendszer ezt a konstruktort hívja meg az átalakítás végrehajtásához.

  • Implicit konverziós operátor: Ha a forrástípus implicit konverziós operátorral rendelkezik, amely a céltípusra konvertál, a rendszer ezt az operátort hívja meg az átalakítás végrehajtásához.

  • Explicit explicit konverziós operátor: Ha a forrástípus explicit konverziós operátorral rendelkezik, amely a céltípusra konvertál, a rendszer ezt az operátort hív meg az átalakítás végrehajtásához. Ha a céltípus explicit konverziós operátorral rendelkezik, amely a forrástípusból konvertál, a rendszer ezt az operátort hívja meg az átalakítás végrehajtásához.

  • IConvertable: System.Convert.ChangeType a lesz hívva az átalakítás végrehajtásához.

6.19 Átalakítás rendezettre

Az értékek pszeudotípus-rendezettre konvertálására vonatkozó szabályok a következők:

  • If the value is a hash literal (§2.3.5.6), the result is an object with an implementation defined type that behaves like a hashtable and the order of the keys matches the order specified in the hash literal.
  • Ellenkező esetben a viselkedés implementációja definiálva lesz.

Csak a kivonat konstansok (a 2.3.5.6) konvertálhatók rendezettre. Az eredmény a egy példánya System.Collections.Specialized.OrderedDictionary.

6.20 Átalakítás pscustomobjectre

Az értékek pszeudotípusú pscustomobject típusra konvertálásának szabályai a következők:

  • A kivonattábla típusú érték PowerShell-objektumká lesz konvertálva. A kivonattáblában minden kulcs egy NoteProperty lesz a megfelelő értékkel.
  • Ellenkező esetben a viselkedés implementációja definiálva lesz.

Az átalakítás mindig engedélyezett, de nem módosítja az érték típusát.