Это связано с новыми перегрузками на string.Join
, добавленными в версии 4 .NET Framework:
PS> [Environment]::Version.ToString()
2.0.50727.5456
PS> [string]::Join.OverloadDefinitions
static string Join(string separator, string[] value)
static string Join(string separator, string[] value, int startIndex, int count)
PS> [Environment]::Version.ToString()
4.0.30319.269
PS> [string]::Join.OverloadDefinitions
static string Join(string separator, Params string[] value)
static string Join(string separator, Params System.Object[] values)
static string Join[T](string separator, System.Collections.Generic.IEnumerable[T] values)
static string Join(string separator, System.Collections.Generic.IEnumerable[string] values)
static string Join(string separator, string[] value, int startIndex, int count)
<ч />
В .NET 2.0 единственный применяемый метод перегрузки принимает string[]
в качестве второго аргумента, поэтому каждый символ из $word.ToCharArray()
приводится к строке.
PS> Trace-Command *Member* { [string]::Join( "-", $word.ToCharArray() ) } -PSHost
...
MemberResolution: Method argument conversion.
MemberResolution: Converting parameter "-" to "System.String".
MemberResolution: Method argument conversion.
MemberResolution: Converting parameter "System.Char[]" to "System.String[]".
MemberResolution: Calling Method: static string Join(string separator, string[] value)
В .NET 4 предпочтительна перегрузка object[]
. Вместо того, чтобы заключать в символы каждый символ, весь массив приводится к объекту, отправляя массив одноэлементного объекта на string.Join
, который затем вызывает ToString
для получения вывода "System.Char[]"
.
Method argument conversion.
Converting parameter "-" to "System.String".
Method argument conversion.
Converting parameter "System.Char[]" to "System.Object".
Method argument conversion.
Converting parameter "System.Object[]" to "System.Object[]".
Calling Method: static string Join(string separator, Params System.Object[] values)
Чтобы получить старое поведение, вы можете вставить [string[]]
приведение, чтобы повлиять на разрешение метода (или в этом случае просто используйте оператор PowerShell -join
, который везде работает правильно:).
PS> $word = 'test'
PS> [string]::Join( '-', $word.ToCharArray() )
System.Char[]
PS> [string]::Join( '-', [string[]]$word.ToCharArray() )
t-e-s-t
PS> [char[]]$word -join '-'
t-e-s-t