PowerShell通用集合

我一直在推进到PowerShell中的.NET框架,我碰到了一些我不明白的东西。 这工作正常:

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

但是,这不是:

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

他们都在同一个集会,所以我错过了什么?

正如在答案中指出的,这几乎只是PowerShell v1的一个问题。

Dictionary <K,V>没有在与SortedDictionary <K,V>相同的程序集中定义。 一个在mscorlib中,另一个在system.dll中。

这就是问题所在。 PowerShell中的当前行为是,当parsing指定的generics参数时,如果这些types不是完全限定的types名称,那么它就会假定它们与您尝试实例化的genericstypes在同一个程序集中。

在这种情况下,这意味着它在System.dll中查找System.String,而不是在mscorlib中,因此失败。

解决scheme是为通用参数types指定完全限定的程序集名称。 这是非常丑陋的,但工程:

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

在PowerShell 2.0中,创buildDictionary的新方法是:

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

在PowerShell中generics有一些问题。 PowerShell团队的开发者Lee Holmes发布了这个脚本来创buildgenerics。