33808


PowerShellでは文字列の配列に対して String クラスのメソッド、例えば `Replace()`
などが呼び出せるようですが、これはどういう仕様によるものなのでしょうか？

[code]

    PS C:\> $arr = "abc","abc"
    
    PS C:\> $arr
    abc
    abc
    
    PS C:\> $arr.GetType()
    
    IsPublic IsSerial Name                                     BaseType                                                                                                                                         
    -------- -------- ----                                     --------                                                                                                                                         
    True     True     Object[]                                 System.Array  
    
    PS C:\> $arr.Replace('b', '_')
    a_c
    a_c
    
[/code]

`GetType()` で型を取得してもただの `Object[]` ですし、Get-Member で見てもこのメソッドは存在しません。Count
のようにエイリアスが追加されているというわけでもないようです。


CC BY-SA 3.0
2017-04-06T05:58:44.637
33807
2017-04-06T05:58:44.637
8000
question
powershell
文字列の配列に対してStringクラスのメソッドが呼べるのはなぜ？


PowerShell 3.0
以降、コレクション自身には存在せず、その要素に存在するメソッド・プロパティを呼び出そうとすると、各要素に対する呼び出しに変換されます。

Foreach
ステートメントの簡略構文と同様、コレクションの要素の型が混在していても構いませんし、一部の要素にだけ存在するメソッド・プロパティを呼び出すこともできます。

[code]

    PS C:\> [System.Linq.Enumerable]::Range(32,10).ToChar($null)  #配列でないコレクション
    
    !
    "
    #
    $
    %
    &
    '
    (
    )
    
    PS C:\> ([DateTime]::Now, [TimeSpan]::FromHours(1)).Ticks  #異なる型だがどちらも実装している
    636270872544918849
    36000000000
    
    PS C:\> ([DateTime]::Now, [TimeSpan]::FromHours(1)).TimeOfDay  #DateTimeしか実装していない
    
    
    Days              : 0
    Hours             : 14
    Minutes           : 38
    Seconds           : 51
    Milliseconds      : 953
    Ticks             : 527319534503
    TotalDays         : 0.610323535304398
    TotalHours        : 14.6477648473056
    TotalMinutes      : 878.865890838333
    TotalSeconds      : 52731.9534503
    TotalMilliseconds : 52731953.4503
    
[/code]

MSDNのドキュメントでは [about_Methods](https://technet.microsoft.com/ja-
jp/library/hh847878.aspx) の「スカラー オブジェクトおよびコレクションのメソッド」に記載があります。


CC BY-SA 3.0
2017-04-06T05:58:44.637
33808
2017-04-06T05:58:44.637
8000
33807
answer