6. převody

Konverze typu je provedena, když je použita hodnota jednoho typu v kontextu, který vyžaduje jiný typ. Pokud takový převod proběhne automaticky, je známý jako implicitní převod. (Běžným příkladem je, že některé operátory potřebují převést jednu nebo více hodnot, které jsou určeny jejich operandy.) Implicitní převod je povolený, pokud je zachován smysl zdrojové hodnoty, jako je například bez ztráty přesnosti čísla při převodu.

Operátor přetypování (§ 7.2.9) umožňuje explicitní převod.

Převody jsou popsány níže, kde jsou uvedeny doplňující informace podle potřeby v popisu každého operátora v § 6,19.

Explicitní převod hodnoty na typ, který už má, způsobí, že se žádná změna této hodnoty nebo její reprezentace nemění.

Pravidla pro převod převodu, pokud je hodnota výrazu svázána s parametrem, je pokryta v § 6,17.

6,1 převod na typ void

Hodnotu libovolného typu lze explicitně zahodit přetypováním na typ void. Neexistuje žádný výsledek.

6,2 převod na bool

Pravidla pro převod libovolné hodnoty na typ bool jsou následující:

  • Číselná nebo znaková hodnota nula je převedena na hodnotu false; Číselná nebo znaková hodnota, která je nenulová, je převedena na hodnotu true.
  • Hodnota typu null je převedena na hodnotu false.
  • Řetězec o délce 0 je převeden na hodnotu false; řetězec o délce > 0 je převeden na hodnotu true.
  • Parametr přepínače s hodnotou $true je převeden na hodnotu true a jedna s hodnotou $false je převedena na hodnotu false.
  • Všechny ostatní hodnoty typu odkazu, které nejsou null, jsou převedeny na hodnotu true.

Pokud typ implementuje IList:

  • Pokud je délka objektu > 2, hodnota je převedena na hodnotu true.
  • Pokud je délka objektu 1 a tento první prvek není sám objektem IList, pak je hodnota převedena na hodnotu true.
  • V opačném případě, pokud je počet prvního prvku >= 1, hodnota je převedena na hodnotu true.
  • V opačném případě je hodnota převedena na false.

6,3 převod na char

Pravidla pro převod libovolné hodnoty na typ char jsou následující:

  • Konverze hodnoty typu bool, Decimal, float nebo Double je chybná.
  • Hodnota typu null je převedena na znak null (U + 0000).
  • Hodnota typu Integer, jejíž hodnota může být reprezentovaná v typu char, má tuto hodnotu; v opačném případě dojde k chybě převodu.
  • Převod řetězcové hodnoty s jinou délkou než 1 je chyba.
  • Řetězcová hodnota, která má délku 1, je převedena na znak, který má hodnotu jednoho znaku.
  • Hodnota číselného typu, jejíž hodnota po zaokrouhlení jakékoli zlomkové části může být reprezentována v cílovém typu, má tuto zaoblenou hodnotu; v opačném případě dojde k chybě převodu.
  • Pro jiné hodnoty typu odkazu, pokud typ odkazu podporuje takový převod, je tento převod použit; v opačném případě dojde k chybě převodu.

6,4 konverze na celé číslo

Pravidla pro převod libovolné hodnoty na typ Byte, int nebo Long jsou následující:

  • Hodnota bool false je převedena na nulu; Hodnota bool true je převedena na 1.
  • Hodnota typu char, jejíž hodnota může být reprezentována v cílovém typu, má tuto hodnotu; v opačném případě dojde k chybě převodu.
  • Hodnota číselného typu, jejíž hodnota po zaokrouhlení jakékoli zlomkové části může být reprezentována v cílovém typu, má tuto zaoblenou hodnotu; v opačném případě dojde k chybě převodu.
  • Hodnota typu null je převedena na nulu.
  • Řetězec, který představuje číslo, je převeden tak, jak je popsáno v § 6,16. Pokud po zkrácení zlomkové části může být výsledek reprezentován v cílovém typu, řetězec je ve správném formátu a má cílový typ; v opačném případě dojde k chybě převodu. Pokud řetězec nepředstavuje číslo, převod je chybný.
  • Pro jiné hodnoty typu odkazu, pokud typ odkazu podporuje takový převod, je tento převod použit; v opačném případě dojde k chybě převodu.

6,5 konverze na float a Double

Pravidla pro převod libovolné hodnoty na typ float nebo Double jsou následující:

  • Hodnota bool false je převedena na nulu; Hodnota bool true je převedena na 1.
  • Hodnota typu char je reprezentována přesně.
  • Hodnota číselného typu je zastoupena přesně, je-li to možné; pro převody int, Long a Decimal na float a pro dlouhé a desítkové převody na dvojnásobnou hodnotu však může dojít ke ztrátě některých z nejméně významných bitů celočíselné hodnoty.
  • Hodnota typu null je převedena na nulu.
  • Řetězec, který představuje číslo, je převeden tak, jak je popsáno v § 6,16; v opačném případě dojde k chybě převodu.
  • Pro jiné hodnoty typu odkazu, pokud typ odkazu podporuje takový převod, je tento převod použit; v opačném případě dojde k chybě převodu.

6,6 převod na desetinné číslo

Pravidla pro převod libovolné hodnoty na typ Decimal jsou následující:

  • Hodnota bool false je převedena na nulu; Hodnota bool true je převedena na 1.
  • Hodnota typu char je reprezentována přesně.
  • Hodnota číselného typu je zastoupena přesně; Pokud je však tato hodnota příliš velká nebo příliš malá, aby se vešla do cílového typu, dojde k chybě převodu.
  • Hodnota typu null je převedena na nulu.
  • Řetězec, který představuje číslo, je převeden tak, jak je popsáno v § 6,16; v opačném případě dojde k chybě převodu.
  • Pro jiné hodnoty typu odkazu, pokud typ odkazu podporuje takový převod, je tento převod použit; v opačném případě dojde k chybě převodu.
  • Rozsah výsledku úspěšného převodu je takový, že Zlomková část neobsahuje žádné koncové nuly.

6,7 převod na objekt

Hodnota libovolného typu s výjimkou typu s hodnotou null (4.1.2) může být převedena na typ Object. Hodnota zachová svůj typ a reprezentaci.

6,8 převod na řetězec

Pravidla pro převod libovolné hodnoty na typ String jsou následující:

  • Hodnota $false bool je převedena na hodnotu false; logická hodnota $true je převedena na hodnotu "true".
  • Hodnota typu char je převedena na řetězec s 1 znaky obsahující tento znak.
  • Hodnota číselného typu je převedena na řetězec, který má formu příslušného číselného literálu. Výsledek však nemá žádné úvodní ani koncové mezery, žádné úvodní znaménko plus, celá čísla mají základ 10 a neexistuje přípona typu. Pro převod typu Decimal se měřítko zachová. Pro hodnoty-∞, + ∞ a NaN jsou výsledné řetězce "-nekonečno", "Infinité" a "NaN" v uvedeném pořadí.
  • Hodnota typu null je převedena na prázdný řetězec.
  • Pro jednorozměrné pole je výsledkem řetězec obsahující hodnotu každého prvku v tomto poli, od začátku do konce, převedeno na řetězec, s prvky, které jsou odděleny aktuálním oddělovačem výstupního pole (§ 2.3.2.2). Pro pole, které má prvky, které jsou sami, jsou převedeny pouze prvky nejvyšší úrovně. Řetězec použitý k reprezentaci hodnoty prvku, který je polem, je definována implementace. Pro multidimenzionální pole je plochý (§ 9,12) a pak se považuje za jednorozměrné pole.
  • Hodnota typu null je převedena na prázdný řetězec.
  • Hodnota typu ScriptBlock je převedena na řetězec obsahující text tohoto bloku bez oddělovače {a} znaků.
  • V případě výčtového typu hodnoty je výsledkem řetězec obsahující název každé konstanty výčtu, která je v dané hodnotě oddělená čárkami.
  • Pro jiné hodnoty typu odkazu, pokud typ odkazu podporuje takový převod, je tento převod použit; v opačném případě dojde k chybě převodu.

Řetězec použitý k reprezentaci hodnoty prvku, který je pole, má formu System.type[] , System.type[,] a tak dále. Pro jiné typy odkazů je volána metoda ToString . Pro jiné výčtové typy je zdrojová hodnota považována za jednorozměrné pole.

6,9 převod na pole

Pravidla pro převod libovolné hodnoty na typ pole jsou následující:

  • Cílový typ nemůže být vícerozměrné pole.
  • Hodnota typu null je ponechána tak, jak je.
  • Pro skalární hodnotu jinou než $null nebo hodnotu typu zatřiďovací tabulky je vytvořeno nové pole s 1 prvky, jehož hodnota je skalární po převodu na cílový typ elementu.
  • Pro jednorozměrné pole hodnota je vytvořeno nové pole cílového typu a každý prvek je zkopírován s převodem ze zdrojového pole na odpovídající prvek v cílovém poli.
  • Pro multidimenzionální hodnotu pole je toto pole nejprve shrnuto (§ 9,12) a pak zpracováno jako hodnota jednorozměrného pole.
  • Řetězcová hodnota je převedena na pole char se stejnou délkou, která má po sobě jdoucí znaky z řetězce, ve kterém se zabírají odpovídající pozice v poli.

Pro jiné vyčíslitelné typy je vytvořeno nové pole 1 element, jehož hodnota je odpovídající prvek po převodu na typ cílového prvku, pokud takový převod existuje. V opačném případě dojde k chybě převodu.

6,10 převod na XML

Objekt je převeden na typ String a následně do objektu dokumentu XML typu xml .

6,11 převod na regulární výraz

Výraz, který určuje hodnotu typu String, lze převést na typ regex .

6,12 převod na ScriptBlock

Pravidla pro převod libovolné hodnoty na typ scriptblock jsou následující:

  • Řetězcová hodnota je považována za název příkazu, který volitelně následuje za argumenty volání tohoto příkazu.

6.13 Převod na výčtové typy

Pravidla pro převod libovolné hodnoty na typ výčtu jsou následující:

  • Hodnota řetězce typu, která obsahuje jednu z pojmenovaných hodnot (s ohledem na případ) pro typ výčtu je převedena na tuto pojmenovanou hodnotu.
  • Hodnota řetězce typu, která obsahuje čárkami oddělený seznam pojmenovaných hodnot (s ohledem na případ) pro typ výčtu je převedena na bitový operátor OR všech těchto pojmenovaných hodnot.

6.14 Převod na jiné odkazové typy

Pravidla pro převod libovolné hodnoty na jiný typ odkazu než typ pole nebo řetězec jsou následující:

  • Hodnota typu null se zachová tak, jak je.
  • Jinak je chování definováno implementací.

Tady si můžete hrát na řadu částí strojů. Patří sem možné použití konstruktorů s jedním argumentem nebo výchozích konstruktorů, pokud je hodnota zatřiďovací tabulkou, implicitními a explicitními operátory převodu a metody Parse pro cílový typ. použití convert.convertto; a převodní mechanismus ETS.

6.15 Obvyklé aritmetické převody

Pokud žádný operand ne určí hodnotu s číselným typem, pak

  • Pokud levý operand určuje hodnotu typu bool, převod je chybně.
  • V opačném případě jsou všechny operandy $null určující hodnotu převedeny na nulu typu int a proces pokračuje číselnými převody uvedenými níže.
  • V opačném případě, pokud levý operand určuje hodnotu typu char a pravý operand určuje hodnotu typu bool, převod je chybně.
  • V opačném případě, pokud levý operand určuje hodnotu řetězce typu, ale nepředstavuje číslo (-6.16), převod je chybně.
  • V opačném případě, pokud pravý operand určuje hodnotu řetězce typu, ale nepředstavuje číslo (-6.16), převod je chybně.
  • V opačném případě se všechny operandy, které navrhují hodnoty řetězce typu, převedou na čísla (6,16) a proces pokračuje číselnými převody uvedenými níže.
  • Jinak je převod chybně.

Číselné převody:

  • Pokud jeden operand určuje hodnotu typu decimal, hodnota určená jiným operandem je v případě potřeby převedena na tento typ. Výsledek má typ decimal.
  • V opačném případě, pokud jeden operand označí hodnotu typu double, hodnota určená jiným operandem je v případě potřeby převedena na tento typ. Výsledek má typ double.
  • V opačném případě, pokud jeden operand označí hodnotu typu float, hodnoty určené oběma operandy jsou v případě potřeby převedeny na typ double. Výsledek má typ double.
  • V opačném případě, pokud jeden operand označí hodnotu typu long, hodnota určená hodnotou druhého operandu je v případě potřeby převedena na tento typ. Výsledek má nejprve typ v sekvenci long a double, který může představovat jeho hodnotu.
  • V opačném případě jsou hodnoty určené oběma operandy v případě potřeby převedeny na typ int. Výsledek má první v sekvenci int, long, double, který může představovat jeho hodnotu bez zkrácení.

6.16 Převod z řetězce na číselný typ

V závislosti na jeho obsahu lze řetězec převést explicitně nebo implicitně na číselnou hodnotu. Konkrétně:

  • Prázdný řetězec je převeden na hodnotu nula.
  • Počáteční a koncové mezery se ignorují. Řetězec však nemusí obsahovat pouze mezery.
  • Řetězec obsahující pouze prázdné znaky nebo ukončovací znaky řádku je převeden na hodnotu nula.
  • Je povoleno jedno úvodní znaménko + nebo .
  • Celé číslo může mít šestnáctkové předpony (0x nebo 0X).
  • Volitelně podepsaný exponent je povolený.
  • Přípony typů a multiplikátory nejsou povolené.
  • Řetězce "-Infinity", "Infinity" a "NaN" jsou rozpoznány jako hodnoty -∞, +∞ a NaN.

6.17 Převod během vazby parametrů

Informace o vazbě parametrů najdete v tématu 8.14.

Pokud je hodnota výrazu svázaná s parametrem, je třeba zvážit další převod, jak je popsáno níže:

  • Pokud je typ parametru bool nebo switch (/4.2.5, #8.10.5) a parametr nemá žádný argument, je hodnota parametru v zvaném příkazu nastavená na $true. Pokud je typ parametru jiný než bool nebo switch, parametr bez argumentu je chybný.
  • Pokud je typ parametru switch a hodnota argumentu je $null, je hodnota parametru nastavená na $false.
  • Pokud je typ parametru object nebo je stejný jako typ argumentu, je hodnota argumentu předána bez převodu.
  • Pokud typ parametru není object nebo scriptblock, vyhodnotí se argument s typem scriptblock a jeho výsledek se předá jako hodnota argumentu. (To se označuje jako zpožděná bloková vazba skriptu.) Pokud je typ parametru object nebo scriptblock, předá se argument s typem scriptblock tak, jak je.
  • Pokud je typ parametru kolekce typu T2 a argument je skalár typu T1, je tento skalární objekt převeden na kolekci typu T2 obsahující jeden prvek. V případě potřeby se skalární hodnota převede na typ T2 pomocí pravidel převodu v této části.
  • Pokud je typ parametru skalární typ jiný než object a argument je kolekce, argument je chybný.
  • Pokud je očekávaný typ parametru kolekce typu T2 a argument je kolekce typu T1, argument je převeden na kolekci typu T2 se stejnou délkou jako kolekce argumentů. V případě potřeby jsou hodnoty elementů kolekce argumentů převedeny na typ T2 pomocí pravidel převodu v této části.
  • Pokud výše uvedené kroky a převody uvedené výše v této kapitole nestačí, použijí se pravidla v 6.18 . Pokud dojde k selhání, vazba parametru selže.

6.18 Převod rozhraní .NET

Při implicitním převodu se nejprve vyzkoušely integrované převody PowerShellu. Pokud se jim převod nepokusí vyřešit, zkusí se následující vlastní převaděče .NET v pořadí shora dolů. Pokud je nalezen převod, ale vyvolá výjimku, převod se nezdařil.

  • PSTypeConverter: Existují dva způsoby přidružení implementace třídy PSTypeConverter k její cílové třídě: prostřednictvím konfiguračního souboru typu (types.ps1xml) System.ComponentModel.TypeConverterAttribute nebo použitím atributu na cílovou třídu. Další informace najdete v dokumentaci k sadě PowerShell SDK.

  • TypeConverter: Tento typ CLR poskytuje jednotný způsob převodu typů hodnot na jiné typy a také pro přístup ke standardním hodnotám a dílčím vlastnostem. Nejběžnější typ převaděče je ten, který převádí na a z textové reprezentace. Převaděč typů pro třídu je svázán s třídou pomocí System.ComponentModel.TypeConverterAttribute. Pokud není tento atribut přepsán, všechny třídy, které dědí z této třídy, používají stejný převaděč typů jako základní třída. Další informace najdete v dokumentaci k sadě PowerShell SDK a technologie Microsoft .NET frameworku.

  • Parsovat metodu: Pokud je zdrojový typ string a Parsecílový typ má metodu s názvem , volá se tato metoda k provedení převodu.

  • Konstruktory: Pokud má cílový typ konstruktor, který převádí jeden argument, jehož typ je typu zdroje, je tento konstruktor volán k provedení převodu.

  • Implicitní operátor přetypování: Pokud má typ zdroje implicitní operátor přetypování, který se převádí na cílový typ, je tento operátor volán k provedení převodu.

  • Operátor explicitního přetypování: Pokud má typ zdroje explicitní operátor přetypování, který je převeden na cílový typ, je tento operátor volán k provedení převodu. Pokud má cílový typ explicitní operátor přetypování, který převádí typ zdroje, je tento operátor volán k provedení převodu.

  • IConvertable: System.Convert.ChangeType je volána k provedení převodu.

6.19 Převod na seřazené

Pravidla pro převod libovolné hodnoty na seřazený pseudo typem jsou následující:

  • Pokud je hodnotou hashovací literál (2.3.5.6), výsledkem je objekt s definovaným typem implementace, který se chová jako zatřiďovací tabulka a pořadí klíčů odpovídá pořadí zadanému v literálu hash.
  • Jinak je chování definováno implementací.

Na seřazené je možné převést pouze literály hash (2.3.5.6). Výsledkem je instance System.Collections.Specialized.OrderedDictionary.

6.20 Převod na pscustomobject

Pravidla pro převod libovolné hodnoty na pseudo type pscustomobject jsou následující:

  • Hodnota typu zatřiďovací tabulka je převedena na objekt PowerShellu. Každý klíč v zatřiďovací tabulce se stane vlastností NoteProperty s odpovídající hodnotou.
  • Jinak je chování definováno implementací.

Převod je vždy povolen, ale nezmění typ hodnoty.