2012-11-08 13 views
5

mojego kodu źródłowego:PowerShell tablica nie jest czyszczony

# $arr = @(); results in same behaviour 
$arr = New-Object System.Collections.ArrayList; 

$arr.Count; 
$arr += "z"; 

$arr.Count; 
$arr.Clear(); 
$arr.Count; 

wyjściowa:

0
1
1

+0

Która wersja Powershell? Kiedy uruchomię to, '$ arr' zostanie rzucone do' System.Array' po '$ arr + =" z "', więc gdy wołam 'Clear()', pojawia się następujący błąd: 'Wywołanie metody nie powiodło się, ponieważ [System.Object []] nie zawiera metody o nazwie "Wyczyść" ' – David

+0

@Dostępne PS3 w systemie Windows 8 RTM. – ComFreek

+0

Ah - Używam v2 na Win 7. – David

Odpowiedz

16

PowerShell robi niektóre odlewania tablica sztuczek kiedy robisz +=, więc proste rozwiązanie jest zrobić $arr.Add("z"). Wtedy $arr.Clear() będzie działać tak, jak oczekujesz.

celu wyjaśnienia:

  1. @() jest tablicą PowerShell. Używa on +=, ale nie można go ustawić na Clear. (Możesz jednak ponownie wykonać $arr = @(), aby zresetować go do pustej tablicy.)
  2. ArrayList to kolekcja .NET. Używa ona .Add, i możesz Clear go, ale z jakiegoś powodu, jeśli to +=, Powershell wykonuje dziwne przymusu tablicy. (Jeśli eksperci starają się to skomentować, są niesamowite.)
+0

Tak, to jest trudne;) Dzięki! Dla tych, którzy mają mnóstwo kodu za pomocą '+ =': możesz również ponownie zainicjować zmienną: '$ arr = @();' – ComFreek

+0

Ale dlaczego otrzymuję wyjątek 'Kolekcja o stałym rozmiarze' przy próbie dodania element: '$ arr = @(); $ arr.Add ("z"); 'Jeśli użyję klasy ArrayList, nie pojawi się. – ComFreek

Powiązane problemy