はじめに(結論)
PowerShell の [] は、見た目が同じでも文脈によって役割が変わる記法です。型まわりに限定すると意味は次の5種類に整理できます。
- 型リテラル
- 型注釈
- キャスト
- 静的メンバー参照
- 属性(Attribute)
要点は次の通りです。
-
[]自体に意味はなく、後ろに何を書くか・どこに置くかで意味が決まる - 型リテラルが基礎で、他はその派生用途
- 属性だけは「実行される処理」ではなく、エンジンに解釈されるメタ情報
背景
PowerShell では次のように、すべて [] を含む記法が混在するため混乱しがちです。
[int]$x = "123" # 型注釈(代入時に暗黙キャスト)
$x = [int]"123" # キャスト(即時変換)
[int]::MaxValue # 静的メンバー参照
[ValidateSet('Dev','Prod')] # 属性
同じ [] でも文脈により意味が異なるのが混乱の原因です。
1. 型リテラル(Type Literal)
何か:[int] や [System.DateTime] のように「型そのもの」を値として表す記法。
型アクセラレータとも呼び、.NETクラスの長い型名をエイリアスで表現できる。
- 形:
[型] - 例:
[int],[string],[System.IO.FileInfo]
何に使う?
- 静的メンバー参照のレシーバー
- 型情報の取得(例:
[int].FullName) - ジェネリック型の土台(例:
[System.Collections.Generic.List[int]])
ポイント:型リテラル単体では処理は起きず、型オブジェクトを指すだけです。
[int].FullName
# 出力: System.Int32
2. 型注釈(Type Annotation)
何か:変数・パラメータ・戻り値に「この型として扱え」という制約をかける。
- 形:
[型]$変数
例(変数・パラメータ):
[int]$x = 10
function Test {
param(
[string]$Name,
[int]$Age
)
}
挙動の本質:代入時・呼び出し時に「暗黙キャスト」が走り、変換できなければエラー。
[int]$x = "123" # OK(文字列→int に暗黙変換)
[int]$x = "abc" # 失敗(変換不可)
まとめ:型注釈 = 制約 + 暗黙キャスト。
3. キャスト(Type Cast)
何か:値を明示的に指定した型へ変換する。
- 形:
[型] 値
例:
[int]"123"
[datetime]"2026-02-04"
[bool]"true"
特徴:
- 即時評価され、失敗すると例外になる
- 型注釈より「明示的に変換したい」意図がはっきりする
$x = [int]"123"
型注釈との違い(重要):
| 観点 | 型注釈 | キャスト |
|---|---|---|
| タイミング | 代入・呼び出し時 | 即時 |
| 目的 | 制約(+暗黙変換) | 変換 |
| 書き方 | [int]$x |
$x = [int]"123" |
4. 静的メンバー参照(Static Member Access)
何か:型が持つ静的プロパティ/メソッドを呼ぶ。
- 形:
[型]::メンバー
例:
[math]::Sqrt(16)
[datetime]::Now
[System.Guid]::NewGuid()
本質:インスタンス不要。ここでの [] は「型リテラル」として使われています。
# インスタンス不要(静的プロパティ)
[datetime]::Today
# インスタンスが必要な場合(インスタンス メソッド)
(Get-Date).AddDays(1)
メモ::: が使えるのは「型リテラル」の後だけです。
5. 属性(Attribute)
何か:関数・パラメータ・クラス等にメタ情報(振る舞い・制約)を付与する。
- 形:
[属性名(引数)]
例1(関数):
function Get-Sample {
[CmdletBinding()]
param()
}
例2(パラメータ):
param(
[Parameter(Mandatory)]
[ValidateSet('Dev','Prod')]
[string]$Env
)
特徴:
- 実行されるコードではなく、PowerShell エンジンに解釈されるメタ情報
- 複数個を縦に積める
- 属性も内部的には .NET の型
[Parameter(Mandatory)]
[ValidateRange(1,10)]
[int]$Count
5つの関係性を一発で整理
[型] ← 型リテラル(型そのもの)
│
├─ [型]$x ← 型注釈(制約)
├─ [型] 値 ← キャスト(変換)
├─ [型]::X ← 静的メンバー参照
└─ [属性()] ← メタ情報付与
混乱しやすいポイント(重要)
- 同じ
[]でも意味は文脈依存
[int]$x # 型注釈
$x = [int]"1" # キャスト
[int]::MaxValue # 静的メンバー参照
- 属性は「関数呼び出し」ではない(エンジンが解釈するメタ情報)
[ValidateSet('Dev','Prod')] # これはメソッド呼び出しではない
まとめ
[] の正体は「型リテラル」または「属性の開始記号」であり、置き場所と後続の記法で意味が決まります。型リテラルを基礎に、型注釈(制約+暗黙変換)、キャスト(即時変換)、静的メンバー参照(::)の4つを使い分け、属性は実行コードではない点を意識しておくと混乱が減ります。