Korábban már láttuk, hogy a PowerShell megpróbálja automatikusan megváltoztatni az objektumok típusát, ha szükséges, a minél kényelmesebb, egyszerűbb parancsbevitel érdekében:
[1] PS I:\>1+2.0+"3"
6
[2] PS I:\>(1+2.0+"3").GetType().FullName
System.Double
Az [1]-es promptban látszik, hogy össze tudok adni egy egész számot, egy lebegőpontos számot egy „szöveg” formátumú számmal anélkül, hogy nekem kellene típuskonverziót végezni. A PowerShell ezt helyettem elvégzi. Megnézi, hogy a művelet tagjait vajon át lehet-e alakítani olyan típusra, amellyel egyrészt a művelet elvégezhető, másrészt nem történik adatvesztés. Erre a célra ebben az esetben a System.Double típus alkalmas, így a PowerShell minden tagot erre konvertál, illetve a végeredményt is ilyen formában adja meg.
Ez nem csak a matematikai műveletekre igaz, hanem az összehasonlításokra is:
[12] PS I:\>15 -eq 15d
True
[13] PS I:\>15.0 -eq 15d
True
[14] PS I:\>15 -eq "15"
True
[15] PS I:\>(15).GetType().FullName
System.Int32
[16] PS I:\>(15d).GetType().FullName
System.Decimal
[17] PS I:\>(15.0).GetType().FullName
System.Double
[18] PS I:\>("15").GetType().FullName
System.String
Azaz az egyenlőségvizsgálat (-eq) nem alkalmas arra, hogy a nem egyforma típusú objektumokat kiszűrhessük segítségével, hiszen a PowerShell típuskonverziót végezhet. Részletesebben az összehasonlítási lehetőségekkel az 1.4.3 Összehasonlító operátorok fejezetben foglalkozom.
Az automatikus típuskonverziónál fontos észben tartani, hogy a kifejezések szigorúan balról jobbra értékelődnek ki, így nem mindegy, hogy milyen sorrendben adjuk meg a műveleteink paramétereit:
[20] PS C:\> 1+"2"
3
[21] PS C:\> "2"+1
21
A [20]-as sorban először egy int típusú számmal találkozik a parancselemző, ehhez próbálja hozzáigazítani a szöveges formátumban megadott „2”-t és így végzi el a műveletet, amelynek eredménye 3 lett.
A [21]-es sorban a szöveges „2”-höz igazítja az 1-et, amit szintén szöveggé alakít, és a két szöveg összeadásának, azaz összeillesztésének eredményét adja meg, ami „21” lett. Láthatjuk, hogy ennek eredménye tényleg sztring típusú:
[22] PS C:\> ("2"+1).gettype().fullname
System.String