web-dev-qa-db-ja.com

C#4のデフォルトパラメータ値:デフォルトのDateTime /オブジェクト値を割り当てる方法

DateTimeがオブジェクトであり、デフォルトのC#パラメーターにコンパイル時定数のみを割り当てることができる場合、DateTimeなどのオブジェクトにデフォルト値を提供するにはどうすればよいですか?

デフォルト値の名前付きパラメーターを使用して、コンストラクターでPOCOの値を初期化しようとしています。

100
Zachary Scott

DateTimeは定数として使用できませんが、null許容型(DateTime?)代わりに。

DateTime?nullのデフォルト値。関数の開始時にnullに設定されている場合は、任意の値に初期化できます。

static void test(DateTime? dt = null)
{
    if (dt == null)
    {
        dt = new DateTime(1981, 03, 01);
    }

    //...
}

次のような名前付きパラメーターを使用して呼び出すことができます。

test(dt: new DateTime(2010, 03, 01));

そして、次のようなデフォルトのパラメーターを使用します。

test();
184
Brian R. Bondy

これを直接行うことができる唯一の方法は、コンパイル時の定数である値default(DateTime)を使用することです。または、DateTime?を使用し、デフォルト値をnullに設定することで回避できます。

TimeSpanに関するこの関連質問 も参照してください。

60
svick

新しいDateTime()もDateTime.MinValueと等しい

そのようなデフォルトのパラメータを作成できます。

void test(DateTime dt = new DateTime())
{
//...
}
8
conical

VBとは異なり、C#は日付リテラルをサポートしていません。また、ILではオプションのパラメーターはこのように見えるため、属性で偽造することはできません。

.method private hidebysig static void foo([opt] int32 x) cil managed
{
    .param [1] = int32(5)
    .maxstack 8
    L_0000: nop 
    L_0001: ret 
}



.method //this is a new method
private hidebysig static //it is private, ???, and static
void foo  //it returns nothing (void) and is named Foo
([opt] int32 x) //it has one parameter, which is optional, of type int32

.param [1] = int32(5) //give the first param a default value of 5
4
Jonathan Allen