Разница в том, что в первом примере вы никогда не объявляли переменную, поэтому вы можете присвоить ей значения любого типа, и она примет их без принуждения, изменив ее тип в соответствии:
PS > $foo = "apple,banana,coconut"
PS > Write-Output $foo.GetType().Name
String
PS > $foo = $foo -split ","
PS > Write-Output $foo.GetType().Name
String[]
PS > $foo = 1
PS > Write-Output $foo.GetType().Name
Int32
Но как только вы явно объявите тип $foo
с помощью [string]
, $foo.GetType()
продолжит сообщать string
, и все, что вы ему назначите, будет приведено к string
. Вы не можете изменить тип объявленной переменной, просто присвоив ей новое значение:
PS > [string] $foo = "apple,banana,coconut"
PS > Write-Output $foo.GetType().Name
String
PS > $foo = $foo -split ","
PS > Write-Output $foo.GetType().Name
String
PS > $foo = 1
PS > Write-Output $foo.GetType().Name
String
Однако вы можете изменить тип, повторно объявив его. Даже внутри функции:
PS > [Int32] $foo = $foo
PS > Write-Output $foo.GetType().Name
Int32
Обратите внимание, что такое назначение объявления не будет выполнено, если значение не будет интерпретироваться как новый тип:
PS > [string] $foo = "apple,banana,coconut"
PS > [Int32] $foo = $foo
Cannot convert value "apple,banana,coconut" to type "System.Int32". Error: "Input string was not in a correct format."
Насколько я знаю, нет способ «не объявлять» тип переменной, чтобы он возвращался к принятию любого типа значения, за исключением полного удаления переменной с помощью Remove-Variable
.