Colecciones genéricas de PowerShell

He estado adentrándome en .NET Framework en PowerShell, y he llegado a algo que no entiendo. Esto funciona bien:

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

Esto sin embargo no:

 $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án en la misma asamblea, entonces ¿qué me estoy perdiendo?

Como se señaló en las respuestas, esto es más o menos un problema con PowerShell v1.

El diccionario no está definido en el mismo conjunto que SortedDictionary . Uno está en mscorlib y el otro en system.dll.

Ahí yace el problema. El comportamiento actual de PowerShell es que, al resolver los parámetros generics especificados, si los tipos no son nombres de tipos completamente calificados, se supone que están en el mismo ensamblaje que el tipo genérico que está intentando crear.

En este caso, significa que está buscando System.String en System.dll, y no en mscorlib, por lo que falla.

La solución es especificar el nombre del ensamblaje totalmente calificado para los tipos de parámetros generics. Es extremadamente feo, pero 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]]" 

En PowerShell 2.0, la nueva forma de crear un Dictionary es:

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

Hay algunos problemas con Generics en PowerShell. Lee Holmes, un desarrollador del equipo de PowerShell, publicó este script para crear generics.