redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

(小ネタ)C#でデフォルト引数に今日の日付や現在時刻を指定する

ちょっと前ですが、以下の記事を読みました。あわせて読みたいの記事も読みましたが、どれも丁寧にまとめられていて良い内容でした。

techlife.cookpad.com

日付を渡すには、Rubyではデフォルト引数で行うのが簡単と書かれていたので、これをC#でやってみようと思いました。

以下のようにデフォルト引数に今日の日付を設定したところ、コンパイルエラーになってしまいました。

string GetData(DateTime? target = DateTime.Today) {
    // targetを使った処理
}

エラーメッセージ

'target' の既定パラメーター値は、コンパイル時の定数である必要があります。

これはDateTime.Todayだけでなく、DateTime.Nowでも同じ。これはデフォルト引数で「今日の日付」とか「現在時刻」を使用することは出来ないってこと?

そんな不便な!と思ったのですが、簡単に回避する方法がありました。それが以下です。

string GetData(DateTime? target = null) {
    if (!target.HasValue)
    {
        target = DateTime.Today;
    }

    // targetを使った処理
}

デフォルト引数にはコンパイル時定数しか設定できないので、デフォルト引数にはnullを設定しておいて、メソッド内でnull判定をして、nullだったら今日の日付を設定する。

パラメータにnullを渡した場合も同じ動作となってしまいますが、今のところこれで困ったことは特にないです。 これでC#でもつらさを軽減できますね。

余談ですが、テストの実行には Chaining Assertion を使ってます。便利。

chainingassertion.codeplex.com