Проблема с использованием Framework 4.0 в Powershell с [system.string] :: join - PullRequest
2 голосов
/ 07 февраля 2012

Исходя из этого Вопрос Я обнаружил, что при использовании powershell.exe.config для загрузки среды выполнения .net Framework 4.0 этот код:

$word = "Thisisatest"
[System.String]::Join("-", $word.ToCharArray())

возврат System.Char[]

Выполнение Powershell без powershell.exe.config тот же код работает правильно.

Кто-то может воспроизвести эту проблему и объяснить, почему ??

Моя коробка - Windows 7 Pro с Powershell 2.0

Редактировать: мой powershell.exe.config

<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
         <supportedRuntime version="v4.0.30319"/>        
         <supportedRuntime version="v2.0.50727"/>        
    </startup>
</configuration>

Ответы [ 2 ]

2 голосов
/ 12 мая 2012

Это связано с новыми перегрузками на 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
0 голосов
/ 07 февраля 2012

Используйте решение, которое я предоставил в другом вопросе. Это поддерживаемый PowerShell метод достижения того, что вы хотите сделать:

"Thisisatest".ToCharArray() -join '-'

http://technet.microsoft.com/en-us/library/dd315375.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...