我今天遇到了很多麻烦,直到我弄清楚,具有类型属性的函数的[ref]参数仅限于位置参数。
示例:
function GetMessage
{
Param ( [ref][string]$message )
if ($message) { $message.Value = 'Hello' }
}
$message = 'ERROR'
GetMessage -message ([ref]$message)
$message这是不起作用的,只是因为变量名为-message。
将其更改为:
GetMessage ([ref]$message)而且它是有效的。
但通过这种方式,您只能有一个可选的类型化ref参数,即最后一个。
另一种方法是删除type属性:
Param ( [ref]$message )然后,命名的参数将再次工作:
GetMessage -message ([ref]$message)问:为什么将命名ref参数限制为一个类型会有问题?我猜这是个bug。
发布于 2018-06-01 20:50:04
我认为它可以像设计的那样工作,只是和其他语言不一样。定义参数时:
Param ([ref][string]$message)PowerShell并不认为这是“$message必须是指向字符串的指针”,而是首先将$message转换为string,然后尝试将其绑定为指针,而在那个阶段并不是这样。在强制转换有意义的地方,它工作得很好:
function GetMessage
{
Param ( [DateTime][String]$message )
if ($message) { $message.GetType() }
}
$message = [DateTime]::Now
GetMessage -message ([DateTime]$message)在上面交换[DateTime]和[String]仍然可以正常工作,并且您会看到您期望的类型(即定义中最左边的类型)。
您可以使用Trace-Command cmdlet深入了解PowerShell正在做什么,如下所示:
Trace-Command -Name metadata,parameterbinding,cmdlet -Expression {
$message = [DateTime]::Now
GetMessage -message ([string]$message)
} -PSHosthttps://stackoverflow.com/questions/50642782
复制相似问题