37

我一直在 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 的一个问题。

4

3 回答 3

83

在 PowerShell 2.0 中,创建 a 的新方法Dictionary是:

$object = New-Object 'system.collections.generic.dictionary[string,int]'
于 2010-02-04T19:23:31.057 回答
20

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

问题就在于此。PowerShell 中的当前行为是,在解析指定的泛型参数时,如果类型不是完全限定的类型名称,它会假定它们与您尝试实例化的泛型类型位于同一程序集中。

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

解决方案是为泛型参数类型指定完全限定的程序集名称。它非常丑陋,但有效:

$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]]"
于 2008-10-09T03:54:42.190 回答
4

PowerShell 中的泛型存在一些问题。PowerShell 团队的开发人员 Lee Holmes 发布了这个脚本来创建泛型。

于 2008-10-08T22:30:19.487 回答