Если вы посмотрите на перегрузки для [string]::Format
:
OverloadDefinitions
-------------------
static string Format(string format, System.Object arg0)
static string Format(string format, System.Object arg0, System.Object arg1)
static string Format(string format, System.Object arg0, System.Object arg1, System.Object arg2)
static string Format(string format, Params System.Object[] args)
static string Format(System.IFormatProvider provider, string format, System.Object arg0)
static string Format(System.IFormatProvider provider, string format, System.Object arg0, System.Object arg1)
static string Format(System.IFormatProvider provider, string format, System.Object arg0, System.Object arg1,
System.Object arg2)
static string Format(System.IFormatProvider provider, string format, Params System.Object[] args)
Вы видите, что вы пытаетесь использовать это:
static string Format(string format, Params System.Object[] args)
Обратите внимание, что он ожидает, что его значения - массив объектов.
Когда вы используете оператор -split
, как вы видели, результатом является[String[]]
, а не [Object[]]
.
$arr = 'that,way'
$arr = $arr -split ","
$arr.GetType()
$arr -is [Object[]] # false
Почему он не приводится в [Object[]]
, даже если это может быть?
Из-за этой перегрузки:
static string Format(string format, System.Object arg0)
$arr -isnot [Object[]]
однако $arr -is [Object]
, поэтому эта перегрузка точно соответствует.
К сожалению, поскольку строка формата содержит 2 замены, и вы вызвали перегрузку, которая предоставляет только1, вы получаете эту ошибку.
Если вы сделали [String]::Format('Just 1: {0}', $arr)
, ваш вызов будет успешным (но результат будет Just 1: System.String[]
из-за вызова метода .ToString()
для аргумента).
Поскольку большинство массивов в PowerShell заканчиваются на [Object[]]
, это работает при определении литерального массива или если ваш массив был назначен как выходнойipeline.
Например, вы все равно можете использовать [String[]]
версию $arr
, если вы выполните одно из следующих действий:
[String]::Format('{0}~{1}', $($arr))
[String]::Format('{0}~{1}', ([Object[]]$arr))
[String]::Format('{0}~{1}', ($arr -as [Object[]]))
[String]::Format('{0}~{1}', ($arr|%{$_}))
А как насчет оператора -f
?
Давайте рассмотрим его исходный код .
Самое первое, что он делает, это пытается преобразовать его аргумент в object[]
:
object[] formatArgsArray = formatArgs as object[];