Существует определенная путаница вокруг терминологии. Эта статья объясняет полезную таксономию систем типов.
PowerShell динамически, неявно набирается:
> $x=100
> $x=dir
Нет ошибок типа - переменная может изменить свой тип во время выполнения. Это похоже на Python , Perl , JavaScript , но отличается от C ++ , Java , C # и др.
Тем не менее:
> [int]$x = 100
> $x = dir
Cannot convert "scripts-2.5" to "System.Int32".
Так что он также поддерживает явную типизацию переменных, если хотите. Однако проверка типов выполняется во время выполнения, а не во время компиляции, поэтому она не статически типизирована.
Я видел, как некоторые говорили, что PowerShell использует вывод типа (потому что вам не нужно объявлять тип переменной), но я думаю, что это неправильные слова. Вывод типа - это особенность систем, которые выполняют проверку типов во время компиляции (например, "var
" в C #). PowerShell проверяет только типы во время выполнения, поэтому он может проверять фактическое значение, а не делать выводы.
Тем не менее, происходит автоматическое преобразование типов:
> [int]$a = 1
> [string]$b = $a
> $b
1
> $b.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
Так некоторые типов конвертируются на лету. По большинству определений это делает PowerShell слабо типизированным языком. Это, конечно, слабее, чем, например, Python, который (почти?) Никогда не конвертирует типы на лету. Но, вероятно, не так слабо, как Perl, который будет преобразовывать почти все, что нужно.