Получение файлов .NET(ArrayList, List,..) в PowerShell

Я только что понял это, и я узнал это с трудом, поэтому хочу поделиться. У вас есть следующий список строк:

>$list = New-Object -TypeName System.Collections.Generic.List[string]
>$list.Add("x")
>$list.Add("yy")
>$list.Add("zzz")
>$list
x
yy
zzz

Теперь, если вы хотите получить количество элементов в списке, вы получите доступ к свойству .Count, и оно даст вам "3", как ожидалось.

>$list.Count
3

Однако иногда вы ошибаетесь, обращаясь к .Length вместо .Count. На других языках, таких как Python или С#, вы получите сообщение об ошибке, указывающее, что это свойство недоступно. Но в PowerShell выясняется, что если он не найден на этом объекте, он выполняет итерацию через содержащиеся объекты и получает доступ к свойству на них. Итак, у вас есть список Ленгтов! Сюрприз!!

>$list.Length
1
2
3

Вы даже можете использовать методы!

>$list.ToUpper()
X
YY
ZZZ

Обратите внимание, что, как я и пробовал, эта "функция" также работает для System.Collections.ArrayList. Но он не работает для встроенного массива PowerShell.

Что называется эта функция? И почему он спроектирован таким образом? Это очень удивительно и подвержено ошибкам.

Ответ 1

Keith Hill упомянул в комментарии, что это новая функция, называемая перечислением Member в V3. См. эту статью MSDN.