Я думаю, что он работает так, как задумано, просто не так, как другие языки.Когда вы определяете параметры:
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