ale*_*lex 2 powershell powershell-3.0
如果你拆分 a string,你会得到一个string[]。
$foo = "apple,banana,coconut"
Write-Output $foo.GetType()
$foo = $foo -split ","
Write-Output $foo.GetType()
Run Code Online (Sandbox Code Playgroud)
如果你拆分一个参数化的string,你会得到一个string.
Function Get-Foo() {
param (
[string] $foo
)
Write-Output $foo.GetType()
$foo = $foo -split ","
Write-Output $foo.GetType()
}
Run Code Online (Sandbox Code Playgroud)
为什么?
不同之处在于,在您的第一个示例中,您从未声明该变量,因此您可以为其分配任何类型的值,并且它会在没有强制的情况下接受它们,更改其类型以匹配:
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
Run Code Online (Sandbox Code Playgroud)
但是一旦你用 明确声明了$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
Run Code Online (Sandbox Code Playgroud)
不过,您可以通过重新声明来更改类型。即使在一个函数中:
PS > [Int32] $foo = $foo
PS > Write-Output $foo.GetType().Name
Int32
Run Code Online (Sandbox Code Playgroud)
请注意,如果该值不可解释为新类型,则此类重新声明分配将失败:
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."
Run Code Online (Sandbox Code Playgroud)
据我所知,没有办法“取消声明”变量的类型,因此它可以恢复接受任何类型的值,而不能使用Remove-Variable.
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |