6. Konwersje

Konwersja typu jest wykonywana, gdy wartość jednego typu jest używana w kontekście, który wymaga innego typu. Jeśli taka konwersja odbywa się automatycznie, jest to nazywane konwersją niejawną. (Częstym przykładem jest to, że niektóre operatory muszą konwertować co najmniej jedną z wartości wyznaczonych przez ich operandy). Dozwolona jest niejawna konwersja, jeśli zostanie zachowane sens wartości źródłowej, na przykład brak utraty dokładności liczby podczas konwersji.

Operator rzutowania ([7.2.9) umożliwia jawną konwersję.

Konwersje zostały omówione poniżej, a informacje uzupełniające są w razie potrzeby podane w opisie każdego operatora w programie .6.19.

Jawna konwersja wartości na typ, który już nie powoduje zmiany tej wartości ani jej reprezentacji.

Reguły dotyczące konwersji, gdy wartość wyrażenia jest powiązana z parametrem, są uwzględnione w parametrze .6.17.

6.1 Konwersja na void

Wartość dowolnego typu można jawnie odrzucić przez rzutowanie jej na typ void. Nie ma żadnego wyniku.

6.2 Konwersja na wartość logiczną

Reguły konwertowania dowolnej wartości na wartość logiczną typu są następujące:

  • Wartość liczbowa lub char o wartości zero jest konwertowana na wartość False; Wartość liczbowa lub char o wartości niezerowej jest konwertowana na wartość True.
  • Wartość typu null jest konwertowana na wartość False.
  • Ciąg o długości 0 jest konwertowany na wartość False. Ciąg o długości > 0 jest konwertowany na wartość True.
  • Parametr przełącznika z wartością jest $true konwertowany na wartość True, a jeden z wartością $false jest konwertowany na wartość False.
  • Wszystkie inne wartości typu referencyjnego inne niż null są konwertowane na wartość True.

Jeśli typ implementuje IList:

  • Jeśli długość obiektu wynosi > 2, wartość jest konwertowana na wartość True.
  • Jeśli długość obiektu wynosi 1, a pierwszy element nie jest sam elementem IList, to jeśli wartość tego elementu jest prawdziwa, wartość jest konwertowana na wartość True.
  • W przeciwnym razie, jeśli liczba pierwszego elementu >= 1, wartość jest konwertowana na wartość True.
  • W przeciwnym razie wartość jest konwertowana na wartość False.

6.3 Konwersja na char

Reguły konwertowania dowolnej wartości na typ char są następujące:

  • Konwersja wartości typu bool, decimal, float lub double jest błędna.
  • Wartość typu null jest konwertowana na znak null (U+0000).
  • Wartość typu liczba całkowita, której wartość może być reprezentowana przez typ char, ma wartość ; w przeciwnym razie konwersja jest błędna.
  • Konwersja wartości ciągu o długości innej niż 1 jest błędna.
  • Wartość ciągu o długości 1 jest konwertowana na znak mający wartość tego jednego znaku.
  • Wartość typu liczbowego, której wartość po zaokrągleniu dowolnej części ułamkowej może być reprezentowana w typie docelowym, ma tę zaokrągloną wartość; w przeciwnym razie konwersja jest błędna.
  • W przypadku innych wartości typu referencyjnego, jeśli typ referencyjny obsługuje taką konwersję, ta konwersja jest używana; w przeciwnym razie konwersja jest błędna.

6.4 Konwersja na liczbę całkowitą

Reguły konwertowania dowolnej wartości na typ byte, int lub long są następujące:

  • Wartość logiczna False jest konwertowana na zero; Wartość logiczna True jest konwertowana na 1.
  • Wartość typu char, której wartość może być reprezentowana w typie docelowym, ma wartość ; w przeciwnym razie konwersja jest błędna.
  • Wartość typu liczbowego, której wartość po zaokrągleniu dowolnej części ułamkowej może być reprezentowana w typie docelowym, ma tę zaokrągloną wartość; w przeciwnym razie konwersja jest błędna.
  • Wartość typu null jest konwertowana na zero.
  • Ciąg reprezentujący liczbę jest konwertowany zgodnie z opisem w .6.16. Jeśli po zakończeniu przycinania części ułamkowej wynik może być reprezentowany w typie docelowym, ciąg jest dobrze formowany i ma typ docelowy; w przeciwnym razie konwersja jest błędna. Jeśli ciąg nie reprezentuje liczby, konwersja jest błędna.
  • W przypadku innych wartości typu referencyjnego, jeśli typ referencyjny obsługuje taką konwersję, ta konwersja jest używana; w przeciwnym razie konwersja jest błędna.

6.5 Konwersja na liczby zmiennoprzecinkowa i podwójna

Reguły konwertowania dowolnej wartości na typ float lub double są następujące:

  • Wartość logiczna False jest konwertowana na zero; Wartość logiczna True jest konwertowana na 1.
  • Wartość char jest reprezentowana dokładnie.
  • Wartość typu liczbowego jest reprezentowana dokładnie, jeśli to możliwe; Jednak w przypadku konwersji int, long i decimal na liczbę zmiennoprzecinkową oraz w przypadku konwersji długich i dziesiętnych na wartość double, niektóre z najmniej znaczących bitów wartości całkowitej mogą zostać utracone.
  • Wartość typu null jest konwertowana na zero.
  • Ciąg reprezentujący liczbę jest konwertowany zgodnie z opisem w .6.16; w przeciwnym razie konwersja jest błędna.
  • W przypadku innych wartości typu referencyjnego, jeśli typ referencyjny obsługuje taką konwersję, ta konwersja jest używana; w przeciwnym razie konwersja jest błędna.

6.6 Konwersja na liczbę dziesiętną

Reguły konwertowania dowolnej wartości na typ dziesiętny są następujące:

  • Wartość logiczna False jest konwertowana na zero; Wartość logiczna True jest konwertowana na 1.
  • Wartość typu char jest reprezentowana dokładnie.
  • Wartość typu liczbowego jest reprezentowana dokładnie; Jeśli jednak ta wartość jest zbyt duża lub zbyt mała, aby zmieściła się w typie docelowym, konwersja jest błędna.
  • Wartość typu null jest konwertowana na zero.
  • Ciąg reprezentujący liczbę jest konwertowany zgodnie z opisem w .6.16; w przeciwnym razie konwersja jest błędna.
  • W przypadku innych wartości typu referencyjnego, jeśli typ referencyjny obsługuje taką konwersję, ta konwersja jest używana; w przeciwnym razie konwersja jest błędna.
  • Skala wyniku pomyślnej konwersji jest taka, że część ułamkowa nie ma zer na koniec.

6.7 Konwersja na obiekt

Wartość dowolnego typu z wyjątkiem typu null (4.1.2) można przekonwertować na obiekt typu. Wartość zachowuje swój typ i reprezentację.

6.8 Konwersja na ciąg

Reguły konwertowania dowolnej wartości na ciąg typu są następujące:

  • Wartość logiczna jest $false konwertowana na wartość "False"; wartość logiczna $true jest konwertowana na wartość "True".
  • Wartość typu char jest konwertowana na 1-znakowy ciąg zawierający ten znak.
  • Wartość typu liczbowego jest konwertowana na ciąg o postaci odpowiadającego literału liczbowego. Jednak wynik nie ma spacji wiodącej ani końcowej, nie ma znaku wiodącego plus, liczby całkowite mają wartość bazową 10 i nie ma sufiksu typu. W przypadku konwersji dziesiętnej skala jest zachowywana. W przypadku wartości -∞, +∞ i NaN wynikowe ciągi to odpowiednio "-Infinity", "Infinity" i "NaN".
  • Wartość typu null jest konwertowana na pusty ciąg.
  • W przypadku tablicy 1-wymiarowej wynikiem jest ciąg zawierający wartość każdego elementu w tej tablicy, od początku do końca, przekonwertowany na ciąg, z elementami oddzielonymi przez bieżący separator pola wyjściowego (";2.3.2.2). W przypadku tablicy z elementami, które same w sobie są tablicami, konwertowane są tylko elementy najwyższego poziomu. Ciąg używany do reprezentowania wartości elementu, który jest tablicą, jest zdefiniowany w implementacji. W przypadku tablicy wielowymiarowej jest ona spłaszczona ([9,12), a następnie traktowana jako tablica 1-wymiarowa.
  • Wartość typu null jest konwertowana na pusty ciąg.
  • Wartość typu scriptblock jest konwertowana na ciąg zawierający tekst tego bloku bez znaków rozdzielających { i }.
  • W przypadku wartości typu wyliczenia wynik jest ciągiem zawierającym nazwę każdej stałej wyliczenia zakodowaną w tej wartości, oddzieloną przecinkami.
  • W przypadku innych wartości typu referencyjnego, jeśli typ referencyjny obsługuje taką konwersję, ta konwersja jest używana; w przeciwnym razie konwersja jest błędna.

Ciąg używany do reprezentowania wartości elementu, który jest tablicą, ma postać System.type[], System.type[,]i tak dalej. W przypadku innych typów referencyjnych wywoływana jest ToString metoda . W przypadku innych typów wyliczowalnych wartość źródłową jest traktowana jak tablica 1-wymiarowa.

6.9 Konwersja na tablicę

Reguły konwertowania dowolnej wartości na typ tablicy są następujące:

  • Typ docelowy może nie być tablicą wielowymiarową.
  • Wartość typu null jest zachowywana bez względu na to, jaka jest.
  • Dla wartości skalarnej $null innej niż lub wartości typu tablica skrótów tworzona jest nowa tablica 1-elementowa, której wartość jest wartością skalarną po konwersji na typ elementu docelowego.
  • Dla 1-wymiarowej wartości tablicy tworzona jest nowa tablica typu docelowego, a każdy element jest kopiowany z konwersją z tablicy źródłowej do odpowiedniego elementu w tablicy docelowej.
  • W przypadku wielowymiarowej wartości tablicy ta tablica jest najpierw spłaszczona ([9,12], a następnie traktowana jako 1-wymiarowa wartość tablicy.
  • Wartość ciągu jest konwertowana na tablicę znaków o tej samej długości z kolejnymi znakami z ciągu zajmującego odpowiednie pozycje w tablicy.

W przypadku innych typów wyliczowalnych tworzona jest nowa tablica 1-elementowa, której wartość jest odpowiednim elementem po konwersji na typ elementu docelowego, jeśli taka konwersja istnieje. W przeciwnym razie konwersja jest błędna.

6.10 Konwersja na xml

Obiekt jest konwertowany na ciąg typu , a następnie na obiekt dokumentu XML typu xml.

6.11 Konwersja na wyrażenia regularne

Wyrażenie, które wyznacza wartość ciągu typu, może zostać przekonwertowane na typ regex.

6.12 Konwersja na scriptblock

Reguły konwertowania dowolnej wartości na typ scriptblock są następujące:

  • Wartość ciągu jest traktowana jako nazwa polecenia opcjonalnie następującego po argumentach wywołania tego polecenia.

6.13 Konwersja na typy wyliczenia

Reguły konwertowania dowolnej wartości na typ wyliczenia są następujące:

  • Wartość typu ciąg zawierający jedną z nazwanych wartości (w odniesieniu do przypadku) dla typu wyliczenia jest konwertowana na wartość nazwaną.
  • Wartość ciągu typu zawierająca rozdzielaną przecinkami listę nazwanych wartości (w odniesieniu do przypadku) dla typu wyliczenia jest konwertowana na bitowe lub wszystkich tych nazwanych wartości.

6.14 Konwersja na inne typy referencyjne

Reguły konwertowania dowolnej wartości na typ referencyjny inny niż typ tablicy lub ciąg są następujące:

  • Wartość typu null jest zachowywana bez względu na to, jaka jest.
  • W przeciwnym razie zachowanie jest zdefiniowane w implementacji.

W tym miejscu do gry przychodzi kilka maszyn. Obejmują one możliwe użycie konstruktorów pojedynczego argumentu lub konstruktorów domyślnych, jeśli wartość jest tablicą skrótów, niejawnymi i jawnymi operatorami konwersji oraz metodami analizy dla typu docelowego; użycie funkcji Convert.ConvertTo; i mechanizm konwersji systemu ETS.

6.15 Zwykłe konwersje arytmetyczne

Jeśli żaden operand nie wyznacza wartości mającej typ liczbowy, wówczas

  • Jeśli lewy operand wyznacza wartość typu bool, konwersja jest błędna.
  • W przeciwnym razie wszystkie operandy $null wyznaczające wartość są konwertowane na zero typu int, a proces jest kontynuowany przy użyciu konwersji liczbowych wymienionych poniżej.
  • W przeciwnym razie, jeśli lewy operand wyznacza wartość typu char, a prawy operand wyznacza wartość typu wartość logiczną, konwersja jest błędna.
  • W przeciwnym razie, jeśli lewy operand wyznacza wartość typu ciąg, ale nie reprezentuje liczby ();6,16), konwersja jest błędna.
  • W przeciwnym razie, jeśli prawy operand wyznacza wartość typu ciąg, ale nie reprezentuje liczby ();6,16), konwersja jest błędna.
  • W przeciwnym razie wszystkie operandy wyznaczające wartości typu ciąg są konwertowane na liczby ([6,16"), a proces jest kontynuowany przy użyciu konwersji liczbowych wymienionych poniżej.
  • W przeciwnym razie konwersja jest błędna.

Konwersje liczbowe:

  • Jeśli jeden operand wyznacza wartość typu dziesiętnego, wartość wyznaczona przez drugi operand jest konwertowana na ten typ, jeśli jest to konieczne. Wynik ma typ dziesiętny.
  • W przeciwnym razie, jeśli jeden operand wyznacza wartość typu double, wartość wyznaczona przez drugi operand jest konwertowana na ten typ, jeśli jest to konieczne. Wynik ma typ double.
  • W przeciwnym razie, jeśli jeden operand wyznacza wartość typu float, wartości wyznaczone przez oba operandy są konwertowane na typ double, jeśli jest to konieczne. Wynik ma typ double.
  • W przeciwnym razie, jeśli jeden operand wyznacza wartość typu long, wartość wyznaczona przez inną wartość operandu jest konwertowana na ten typ, jeśli jest to konieczne. Wynik ma typ pierwszy w sekwencji długi i podwójny, który może reprezentować jego wartość.
  • W przeciwnym razie wartości wyznaczone przez oba operandy są konwertowane na typ int, jeśli to konieczne. Wynik ma pierwszą w sekwencji int, long, double, która może reprezentować jej wartość bez przycinania.

6.16 Konwersja z ciągu na typ liczbowy

W zależności od jego zawartości ciąg może zostać jawnie lub niejawnie przekonwertowany na wartość liczbową. Są to:

  • Pusty ciąg jest konwertowany na wartość zero.
  • Spacje wiodące i końcowe są ignorowane; Jednak ciąg nie może składać się tylko ze spacji.
  • Ciąg zawierający tylko białe znaki i/lub terminatory wiersza jest konwertowany na wartość zero.
  • Dozwolony jest jeden znak wiodącego znaku + lub .
  • Liczba całkowita może mieć prefiks szesnastkowy (0x lub 0X).
  • Wykładnik z podpisem opcjonalnym jest dozwolony.
  • Sufiksy typów i multipliki nie są dozwolone.
  • Ciągi z odrębnymi literami "-Infinity", "Infinity" i "NaN" są rozpoznawane odpowiednio jako wartości -∞, +∞ i NaN.

6.17 Konwersja podczas wiązania parametrów

Aby uzyskać informacje na temat powiązania parametrów, zobacz .8.14.

Gdy wartość wyrażenia jest powiązana z parametrem, istnieją dodatkowe zagadnienia dotyczące konwersji, zgodnie z poniższym opisem:

  • Jeśli typ parametru to bool lub switch (przełącznik (przełączanie 4.2.5, ?8.10.5), a parametr nie ma argumentu, wartość parametru w wywołaniu polecenia jest ustawiona na $true. Jeśli typ parametru jest inny niż wartość logiczna lub przełącznik, parametr bez argumentu jest błędny.
  • Jeśli typ parametru to switch, a wartość argumentu to $null, wartość parametru jest ustawiona na .$false
  • Jeśli typ parametru jest obiektem lub jest taki sam jak typ argumentu, wartość argumentu jest przekazywana bez konwersji.
  • Jeśli typ parametru nie jest obiektem ani elementem scriptblock, jest obliczany argument z typem scriptblock, a jego wynik jest przekazywany jako wartość argumentu. (Jest to nazywane opóźnione powiązanie bloku skryptu). Jeśli typ parametru to object lub scriptblock, argument z typem scriptblock jest przekazywany w stanie, w jaki jest.
  • Jeśli typ parametru jest kolekcją typu T2, a argument jest wartością skalarną typu T1, ten skalar jest konwertowany na kolekcję typu T2 zawierającą jeden element. W razie potrzeby wartość skalarna jest konwertowana na typ T2 przy użyciu reguł konwersji w tej sekcji.
  • Jeśli typ parametru jest typem skalarną innym niż object, a argument jest kolekcją, argument jest błędny.
  • Jeśli oczekiwany typ parametru jest kolekcją typu T2, a argument jest kolekcją typu T1, argument jest konwertowany na kolekcję typu T2 o takiej samej długości jak kolekcja argumentów. W razie potrzeby wartości elementów kolekcji argumentów są konwertowane na typ T2 przy użyciu reguł konwersji w tej sekcji.
  • Jeśli powyższe kroki i konwersje określone wcześniej w tym rozdziale nie wystarczą, zostaną zastosowane reguły opisane w pliku .6.18 . Jeśli te nie powiodą się, powiązanie parametru zakończy się niepowodzeniem.

6.18. Konwersja .NET

W przypadku niejawnej konwersji najpierw są próbne wbudowane konwersje programu PowerShell. Jeśli nie można rozpoznać konwersji, zostaną wypróbowane niestandardowe konwertery .NET w kolejności od góry do dołu. Jeśli konwersja zostanie znaleziona, ale zrzuci wyjątek, konwersja nie powiodła się.

  • PSTypeConverter: Istnieją dwa sposoby kojarzenia implementacji klasy PSTypeConverter z jej klasą docelową: za pomocą pliku konfiguracji typu (types.ps1xml) System.ComponentModel.TypeConverterAttribute lub przez zastosowanie atrybutu do klasy docelowej. Aby uzyskać więcej informacji, zapoznaj się z dokumentacją zestawu SDK programu PowerShell.

  • TypeConverter: Ten typ CLR zapewnia ujednolicony sposób konwertowania typów wartości na inne typy, a także uzyskiwania dostępu do standardowych wartości i właściwości podrzędnych. Najpopularniejszym typem konwertera jest typ, który konwertuje na i z reprezentacji tekstowej. Konwerter typów dla klasy jest powiązany z klasą za pomocą klasy System.ComponentModel.TypeConverterAttribute. O ile ten atrybut nie zostanie zastąpiony, wszystkie klasy dziedziczące z tej klasy używają tego samego konwertera typów co klasa bazowa. Aby uzyskać więcej informacji, zapoznaj się z dokumentacją zestawu SDK programu PowerShell Microsoft .NET framework programu PowerShell.

  • Analizowanie metody: jeśli typ źródłowy jest ciągiem, a Parsetyp docelowy ma metodę o nazwie , ta metoda jest wywoływana w celu przeprowadzenia konwersji.

  • Konstruktory: Jeśli typ docelowy ma konstruktora, który przyjmuje pojedynczy argument, którego typem jest typ typu źródłowego, ten konstruktor jest wywoływany w celu przeprowadzenia konwersji.

  • Niejawny operator rzutowania: jeśli typ źródłowy ma niejawny operator rzutowania, który konwertuje na typ docelowy, ten operator jest wywoływany w celu przeprowadzenia konwersji.

  • Jawny operator rzutowania: jeśli typ źródłowy ma jawny operator rzutowania, który konwertuje na typ docelowy, ten operator jest wywoływany w celu przeprowadzenia konwersji. Jeśli typ docelowy ma jawny operator rzutowania, który konwertuje typ źródłowy, ten operator jest wywoływany w celu przeprowadzenia konwersji.

  • IConvertable: System.Convert.ChangeType jest wywoływana w celu przeprowadzenia konwersji.

6.19 Konwersja na zamówione

Reguły konwertowania dowolnej wartości na uporządkowany typ pseudo są następujące:

  • Jeśli wartość jest literałem skrótu ();2.3.5.6), wynik jest obiektem ze zdefiniowanym typem implementacji, który zachowuje się jak tablica skrótów, a kolejność kluczy jest taka, jak określona w literału skrótu.
  • W przeciwnym razie zachowanie jest zdefiniowane w implementacji.

Na wartość uporządkowaną można konwertować tylko literały skrótu ();2.3.5.6. Wynikiem jest wystąpienie klasy System.Collections.Specialized.OrderedDictionary.

6.20 Konwersja na pscustomobject

Reguły konwertowania dowolnej wartości na pseudo-typ pscustomobject są następujące:

  • Wartość tablicy skrótów typu jest konwertowana na obiekt programu PowerShell. Każdy klucz w tablicy skrótów staje się NoteProperty z odpowiednią wartością.
  • W przeciwnym razie zachowanie jest zdefiniowane w implementacji.

Konwersja jest zawsze dozwolona, ale nie zmienia typu wartości.