2010年11月20日土曜日

◆変数の型

Powershellの変数はかなり柔軟だ。
Powershellで厳密な型付けにこだわるのはナンセンスというもの。キャストだろうがボクシングだろうがどうぞご自由に?。

しかし、一応型付けもできるということは知っておいたほうが良いだろう。

PS>$a = 1
PS>$a.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

PS>$a = "1"
PS>$a.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

PS>[int]$a = 1
PS>$a.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

PS>$a = "A"
値 "A" を型 "System.Int32" に変換できません。エラー: "Input string was not in a
発生場所 行:1 文字:3
+ $a <<<<  = "A"
    + CategoryInfo          : MetadataError: (:) []、ArgumentTransformationMeta
    + FullyQualifiedErrorId : RuntimeException

PS>$arr = 1,2,3
PS>$arr.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS>$arr = [int[]]1,2,3
PS>$arr.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS>$arr = [int[]](1,2,3)
PS>$arr.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32[]                                  System.Array

PS>$arr += 4
PS>$arr.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS>[int[]]$arr = 1,2,3
PS>$arr.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32[]                                  System.Array

PS>$arr += 4
PS>$arr.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32[]                                  System.Array

[int[]]1,2,3 がobject配列になっているのは型指定が1にしか効いていないからだろう。括弧で囲めばint配列になってくれる。
しかし、4を追加した時点でobject配列になってしまう。
確実にint配列にしたいときは、
[int[]]$arr = 1,2,3 こんな感じで。


0 件のコメント:

コメントを投稿