関数のデフォルト引数にDateTime型
C#で、関数のデフォルト引数に、DateTime型を用いた時に、
例えば、デフォルト値にDateTime.MinValueを指定すると、エラーになってしまい(下図)、引数のデフォルト値が指定できません。
public static void FuncA(DateTime t1 = DateTime.MinValue) { }
defaultを使用する方法
DateTime?型(null許容型)を使用できる場合は、後述の「追記: DateTime?型を使用する方法」を利用した方が、より少ないコード量で、柔軟にコードが記述できるようです。
本章の「defaultを使用する方法」は、DateTime型を使用したい場合(null許容型を使いたくない場合)の回避方法になります。
default(DateTime)を使用すれば、引数のデフォルト値に指定が可能になります。(下図、エラーが消える)
public static void FuncA(DateTime t1 = default(DateTime)) { }
更に簡略化して、defaultだけでもOKのようです。
public static void FuncA(DateTime t1 = default) { }
DateTimeのdefault値は、DateTime.MinValueと同じ値の、0001/01/01 0:00:00になっています。
判定
関数引数がデフォルト値かどうか、if文で判定する場合は、
public static void FuncA(DateTime t1 = default) {
if (t1 == default)
t1 = DateTime.Now;
...
}
若しくは、
public static void FuncA(DateTime t1 = default) {
t1 = t1 == default ? DateTime.Now : t1;
...
}
追記: DateTime?型を使用する方法
コメント欄でのご指摘をここに追記致します。
DateTime?型を使用することで、デフォルト値にnullを指定することが出来るようになり、これを回避できます。(コメント欄参照)
public static void FuncA(DateTime? t1 = null) { }
こちらの方が、より少ないコード量で、柔軟にコードが記述できるようです。
判定
関数引数がデフォルト値かどうかは、if文で判定するより簡単な「??」を使用することが出来るようで、
public static void FuncA(DateTime? t1 = null) {
t1 = t1 ?? DateTime.Now;
...
}
若しくは、
public static void FuncA(DateTime? t1 = null) {
t1 ??= DateTime.Now;
...
}
より少ないコード量で、柔軟にコードが記述できました。
参考: