Coleções genéricas do PowerShell

Eu fui empurrando para o framework .NET no PowerShell, e eu bati em algo que não entendo. Isso funciona bem:

$foo = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]" $foo.Add("FOO", "BAR") $foo Key Value --- ----- FOO BAR 

Isso, no entanto, não:

 $bar = New-Object "System.Collections.Generic.SortedDictionary``2[System.String,System.String]" New-Object : Cannot find type [System.Collections.Generic.SortedDictionary`2[System.String,System.String]]: make sure t he assembly containing this type is loaded. At line:1 char:18 + $bar = New-Object <<<< "System.Collections.Generic.SortedDictionary``2[System.String,System.String]" 

Ambos estão na mesma assembléia, então o que estou perdendo?

Como foi apontado nas respostas, isso é praticamente apenas um problema com o PowerShell v1.

O dictionary não está definido no mesmo assembly que SortedDictionary . Um está no mscorlib e o outro no system.dll.

Ai que está o problema. O comportamento atual no PowerShell é que, ao resolver os parâmetros genéricos especificados, se os tipos não forem nomes de tipo totalmente qualificados, isso pressupõe que eles estejam no mesmo assembly que o tipo genérico que você está tentando instanciar.

Nesse caso, isso significa que ele está procurando System.String no System.dll e não no mscorlib, portanto, ele falha.

A solução é especificar o nome completo do assembly para os tipos de parâmetros genéricos. É extremamente feio, mas funciona:

 $bar = new-object "System.Collections.Generic.Dictionary``2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" 

No PowerShell 2.0, a nova maneira de criar um Dictionary é:

 $object = New-Object 'system.collections.generic.dictionary[string,int]' 

Existem alguns problemas com genéricos no PowerShell. Lee Holmes, um desenvolvedor da equipe do PowerShell, postou este script para criar o Generics.