首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么PowerShell不接受函数的命名和类型化[ref]参数?

为什么PowerShell不接受函数的命名和类型化[ref]参数?
EN

Stack Overflow用户
提问于 2018-06-01 19:50:00
回答 1查看 246关注 0票数 2

我今天遇到了很多麻烦,直到我弄清楚,具有类型属性的函数的[ref]参数仅限于位置参数。

示例:

代码语言:javascript
运行
复制
function GetMessage
{
    Param ( [ref][string]$message )

    if ($message) { $message.Value = 'Hello' }
}

$message = 'ERROR'
GetMessage -message ([ref]$message)
$message

这是不起作用的,只是因为变量名为-message

将其更改为:

代码语言:javascript
运行
复制
GetMessage ([ref]$message)

而且它是有效的。

但通过这种方式,您只能有一个可选的类型化ref参数,即最后一个。

另一种方法是删除type属性:

代码语言:javascript
运行
复制
Param ( [ref]$message )

然后,命名的参数将再次工作:

代码语言:javascript
运行
复制
GetMessage -message ([ref]$message)

问:为什么将命名ref参数限制为一个类型会有问题?我猜这是个bug。

EN

Stack Overflow用户

发布于 2018-06-01 20:50:04

我认为它可以像设计的那样工作,只是和其他语言不一样。定义参数时:

代码语言:javascript
运行
复制
Param ([ref][string]$message)

PowerShell并不认为这是“$message必须是指向字符串的指针”,而是首先将$message转换为string,然后尝试将其绑定为指针,而在那个阶段并不是这样。在强制转换有意义的地方,它工作得很好:

代码语言:javascript
运行
复制
function GetMessage
{
    Param ( [DateTime][String]$message )

    if ($message) { $message.GetType() }
}

$message = [DateTime]::Now
GetMessage -message ([DateTime]$message)

在上面交换[DateTime][String]仍然可以正常工作,并且您会看到您期望的类型(即定义中最左边的类型)。

您可以使用Trace-Command cmdlet深入了解PowerShell正在做什么,如下所示:

代码语言:javascript
运行
复制
Trace-Command -Name metadata,parameterbinding,cmdlet -Expression {
    $message = [DateTime]::Now
    GetMessage -message ([string]$message)
} -PSHost
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50642782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档