2012年11月28日水曜日

◆関数の戻り値への注意(メモ)

最近仕事の関係で少しC#を使っている。
そのせいでC#頭になっていたためか、Powershellで以下のようなエラーに悩まされた。(実際にはもう少し大きな関数)

001
002
003
004
005
006
007

function MonthNext([Datetime]$p1){
  $aList.Add($p1
)
  return $p1.AddMonths(1
)
}

$aList = New-Object System.Collections.ArrayList
$翌月 = MonthNext (Get-Date)
$翌々月 = MonthNext $翌月

MonthNext : パラメーター 'p1' の引数変換を処理できません。"System.Object[]" の値を "
System.Object[]" 型から "System.DateTime" 型に変換できません。

発生場所 C:\Users\kumagai_mitsugu\AppData\Local\Temp\f481cf43-ee2
c-41bc-ae84-155af6663cc7.ps1:7 文字:17
+ $翌々月 = MonthNext <<<<  $翌月
    + CategoryInfo          : InvalidData: (:) [MonthNext]、P
   arameterBindin...mationException
    + FullyQualifiedErrorId : ParameterArgumentTransformatio
   nError,MonthNext

7行目の引数「$翌月」が日付型に変換できないというエラーだ。

ん~、AddMonthsしてreturnしているんだから当然日付型のはずっと悩んでしまった。

調べてみると戻り値がこんな感じになっている。

PS>$翌月
0

2012年12月28日 9:33:52


PS>$翌月.GetType()

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

どうやら「0」と「日付」のオブジェクト配列となっているようである。

「0」って何だ?としばらく悩んだ挙句、ArrayListにAddしたときの戻り値だと気付いた。

判ってしまえば何の事はない。
ArrayListのAddに戻り値があるのは何度も経験しているし、Powershellの場合「return」に特に意味はないことも判っている(あっても無くても結果は同じ)、関数内の複数個所で出力すれば纏めてリターンされることも判っている。

すべてが判っていることなのだが、少しずつの錯覚が重なって結構嵌ってしまった。

こんな時の為に戻り値を一旦クリアできたら便利な気もするのだが・・・。

0 件のコメント:

コメントを投稿