4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C#で関数のデフォルト引数にDateTime型を用いると引数のデフォルト値が指定できない点の回避

Last updated at Posted at 2023-02-19

関数のデフォルト引数にDateTime型

C#で、関数のデフォルト引数に、DateTime型を用いた時に、
例えば、デフォルト値にDateTime.MinValueを指定すると、エラーになってしまい(下図)、引数のデフォルト値が指定できません。

public static void FuncA(DateTime t1 = DateTime.MinValue) { }

image.png

defaultを使用する方法

DateTime?型(null許容型)を使用できる場合は、後述の「追記: DateTime?型を使用する方法」を利用した方が、より少ないコード量で、柔軟にコードが記述できるようです。
本章の「defaultを使用する方法」は、DateTime型を使用したい場合(null許容型を使いたくない場合)の回避方法になります。

default(DateTime)を使用すれば、引数のデフォルト値に指定が可能になります。(下図、エラーが消える)

public static void FuncA(DateTime t1 = default(DateTime)) { }

image.png

更に簡略化して、defaultだけでもOKのようです。

public static void FuncA(DateTime t1 = default) { }

image.png
 ↓
image.png

DateTimeのdefault値は、DateTime.MinValueと同じ値の、0001/01/01 0:00:00になっています。
image.png

判定

関数引数がデフォルト値かどうか、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;
    ...
}

より少ないコード量で、柔軟にコードが記述できました。

参考:

4
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?