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

时间:2018-06-01 11:50:00

标签: function powershell parameters ref

今天我遇到了很多麻烦,直到我发现,具有type属性的 <kendo-combobox id="chartcomboBoxId" [data]="data" [(value)]="selectedValue" [textField]="'desc'" [valueField]="'name'" [valuePrimitive]="true" (valueChange)="handleValueChange($event)" [popupSettings]="{appendTo: 'component'}" <!-- <=== This line is a solution--> *ngIf="data"> </kendo-combobox> 函数参数仅限于位置参数。

示例:

[ref]

这不起作用,只是因为变量名function GetMessage { Param ( [ref][string]$message ) if ($message) { $message.Value = 'Hello' } } $message = 'ERROR' GetMessage -message ([ref]$message) $message

将其更改为:

-message

它有效。

但是这样,你只能有一个可选的类型化参数,最后一个参数。

作为替代方法,您可以删除type属性:

GetMessage ([ref]$message)

然后命名参数将再次起作用:

Param ( [ref]$message )

问题:为什么将命名GetMessage -message ([ref]$message) 参数限制为类型应该是一个问题?我想这是一个错误。

1 个答案:

答案 0 :(得分:2)

我认为它按设计工作,与其他语言不同。定义参数时:

Param ([ref][string]$message)

PowerShell并未将此视为&#39; $message必须是指向字符串&#39;的指针,但首先会将$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)
} -PSHost