2008-10-08 7 views
35

J'ai poussé dans le framework .NET dans PowerShell, et j'ai frappé quelque chose que je ne comprends pas. Cela fonctionne très bien:Collections génériques PowerShell

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

Key               Value 
---               ----- 
FOO               BAR 

Cela ne signifie toutefois pas:

$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]" 

Ils sont tous les deux dans le même ensemble, donc ce que je manque?

Comme cela a été souligné dans les réponses, cela ne pose pratiquement aucun problème avec PowerShell v1.

Répondre

17

Dictionnaire < K, V> n'est pas défini dans le même assemblage que SortedDictionary < K, V>. L'un est dans mscorlib et l'autre dans system.dll.

C'est là que réside le problème. Le comportement actuel dans PowerShell est que, lors de la résolution des paramètres génériques spécifiés, si les types ne sont pas des noms de types pleinement qualifiés, cela suppose qu'ils sont dans le même assemblage que le type générique que vous essayez d'instancier. Dans ce cas, cela signifie qu'il recherche System.String dans System.dll, et non dans mscorlib, il échoue donc.

La solution consiste à spécifier le nom complet de l'assembly pour les types de paramètres génériques. Il est extrêmement laid, mais fonctionne:

$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]]" 
+0

Y a-t-il une référence qui décrit cette syntaxe? J'essaye d'implémenter BeginInvoke à partir d'un objet Powershell et d'avoir un peu de temps avec l'utilisation des paramètres d'entrée et de sortie dans l'une des surcharges pour cela. Je n'arrive pas à avoir la bonne déclaration. –

4

Il y a quelques problèmes avec Generics dans PowerShell. Lee Holmes, un développeur de l'équipe PowerShell, a publié this script pour créer des génériques.

+2

[lien en cache] (https://web.archive.org/web/20090926122811 /http://www.leeholmes.com/blog/CreatingGenericTypesInPowerShell.aspx) – user2426679

+1

Est-ce "ce soir" encore? :) – mklement0

78

Dans PowerShell 2.0 la nouvelle façon de créer un Dictionary est:

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

+1 Beaucoup mieux répondre – galaktor

+7

C'est vrai que c'est une bien meilleure réponse. ** Si ** l'utilisateur est sur v2. La question a été posée à propos de v1 cependant. Il y a encore un grand nombre de personnes dans le monde qui sont sur v1 aussi bien. – EBGreen

+0

Évidemment, vous aurez le même problème dans v2 si l'un des types est déclaré dans un assembly tiers: http://stackoverflow.com/questions/11975130. Cela semble être corrigé dans v4 – marsze

Questions connexes