Почему PowerShell не принимает именованный и типизированный параметр [ref] для функций? - PullRequest
0 голосов
/ 01 июня 2018

У меня было много проблем сегодня, пока я не понял, что [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 типом?Я думаю, это ошибка.

1 Ответ

0 голосов
/ 01 июня 2018

Я думаю, что он работает так, как задумано, просто не так, как другие языки.Когда вы определяете параметры:

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] в приведенном выше примере все еще работает нормально, и вы видите ожидаемый тип (т. Е. Тот, который находится слева в определении).).

Вы можете получить представление о том, что делает PowerShell, с помощью командлета Trace-Command, например:

Trace-Command -Name metadata,parameterbinding,cmdlet -Expression {
    $message = [DateTime]::Now
    GetMessage -message ([string]$message)
} -PSHost
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...