PowerShell绝对属于动态语言类别,但它会被认为是强类型的吗?
在terminlogy周围存在一定程度的混淆.本文解释了类型系统的有用分类.
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那样弱,它会根据需要转换几乎任何东西.
它可以是你需要的.
像这样:
[1] » [int]$x = 5 [2] » $x 5 [3] » $x = 'haha' Cannot convert value "haha" to type "System.Int32". Error: "Input string was not in a correct format." At line:1 char:3 + $x <<<< = 'haha' [4] »
使用[type]表示法来指示您是否关心强类型变量.
编辑:
正如edg指出的那样,这并不妨碍PowerShell在执行(5 +"5")时将"5"解释为整数.我挖了一点,根据Windows PowerShell in Action中的 Bruce Payette ,PowerShell实际上是一种"类型混杂的语言".所以,我猜,我的答案是"有点".