web-dev-qa-db-ja.com

オプションのDateTimeパラメータを作成するにはどうすればよいですか?

参照型を返すこの関数があります。現在、この関数には2つのオプションのパラメーターがあり、どちらもDateTimeクラスのインスタンスです。関数は次のようなものです。

_public DateTime GetDate(DateTime start = DateTime.MinValue, DateTime end = DateTime.MinValue)
{
    // Method body...
}
_

VSからのエラーは次のとおりです。

'start'のデフォルトのパラメータ値はコンパイル時定数でなければなりません

もちろん、エラーは2番目のパラメーターに適用され、何が起こっているのかを完全に理解しています。

私が本当に望んでいるのは、これを実行する方法があるかどうか、つまり、メソッドにオプションのパラメーターがあるかどうかを知ることです。今、私がやったことはオーバーロードを作成することです。つまり、パラメーターのない関数GetDate()とその2パラメーターのオーバーロードを作成しました。

これは実際には問題ではありませんが、それを行う方法があるかどうかを知りたいだけです。

14
afaolek

回避策の1つは、次のように割り当てることです。

public DateTime GetDate(DateTime? start = null, DateTime? end = null){
    start = start ?? DateTime.MinValue;
    end = end ?? DateTime.MinValue;

    Console.WriteLine ("start: " + start);
    Console.WriteLine ("end: " + end);
    return DateTime.UtcNow;
}

これは次のように使用できます:

void Main()
{
    new Test().GetDate();
    new Test().GetDate(start: DateTime.UtcNow);
    new Test().GetDate(end: DateTime.UtcNow);
    new Test().GetDate(DateTime.UtcNow, DateTime.UtcNow);
}

そして、期待どおりに機能します。

start: 1/01/0001 0:00:00
end: 1/01/0001 0:00:00

start: 8/08/2014 17:30:29
end: 1/01/0001 0:00:00

start: 1/01/0001 0:00:00
end: 8/08/2014 17:30:29

start: 8/08/2014 17:30:29
end: 8/08/2014 17:30:29

startendの値を区別するために、名前付きパラメーターに注意してください。

19
Jeroen Vannevel

ところで、他のすべての回答が言うように、null許容日時を使用する必要はありません。 DateTimeでも実行できます。

public DateTime GetDate(
     DateTime start = default(DateTime), 
     DateTime end = default(DateTime))
{
     start = start == default(DateTime) ? DateTime.MinValue : start;
     end = end == default(DateTime) ? DateTime.MinValue : end;
}

これは起こりそうにありませんが、実際にデフォルトの日時値を関数に渡した場合、期待どおりに機能しません。

7
Selman Genç

パラメータが指定されていない場合は、DateTimeをnull許容に設定してから、DateTime.Minに変換できます。

public DateTime GetDate(DateTime? start = null, DateTime? end = null) {
    var actualStart = start ?? DateTime.Min;
    var actualEnd = end ?? DateTime.Min;
}
4
Neil Smith

唯一の方法は、次のようにすることです(もう少しコードがありますが、オプションの引数が提供されます)。

public DateTime GetDate(DateTime? start = null, DateTime? end = null)
{
    // Method body...
    if(start == null)
    {
      start = DateTime.MinValue;
    }

    //same for end
}
3
Marcel N.