Domanda

Sto spingendo nel framework .NET in PowerShell e ho colpito qualcosa che non capisco. Funziona bene:

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

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

Questo tuttavia non:

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

Sono entrambi nello stesso assieme, quindi cosa mi sto perdendo?

Come è stato sottolineato nelle risposte, questo è praticamente solo un problema con PowerShell v1.

È stato utile?

Soluzione

dizionario < K, V > non è definito nello stesso assembly di SortedDictionary < K, V > ;. Uno è in mscorlib e l'altro in system.dll.

Qui sta il problema. Il comportamento attuale in PowerShell è che quando si risolvono i parametri generici specificati, se i tipi non sono nomi di tipo pienamente qualificati, si presume che si trovino nello stesso assembly del tipo generico che si sta tentando di creare un'istanza.

In questo caso, significa che cerca System.String in System.dll e non in mscorlib, quindi non riesce.

La soluzione è specificare il nome dell'assembly completo per i tipi di parametri generici. È estremamente brutto, ma funziona:

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

Altri suggerimenti

In PowerShell 2.0 il nuovo modo di creare un Dizionario è:

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

Ci sono alcuni problemi con Generics in PowerShell. Lee Holmes, uno sviluppatore del team PowerShell ha pubblicato questo script per creare Generics.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top