views:

594

answers:

3

If DateTime is an object and default C# parameters can only be assigned compile-time constants, how do you provide default values for objects like DateTime?

I am trying to initialize values in a POCO with a constructor, using named parameters with default values.

+8  A: 

DateTime cannot be used as a constant but you could make it a nullable type (DateTime?) instead.

Give the DateTime? a default value of null, and if it is set to null at the start of your function, then you can initialize it to any value you want.

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

    //...
}

You can call it with a named parameter like this:

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

And with the default parameter like this:

test();
Brian R. Bondy
+1, nice cheat ;)
Diadistis
What about DateTime.MinValue?
Dr. Zim
@Dr.Zim: No it's readonly but not constant.
Brian R. Bondy
And why wouldn't DateTime.MinValue be a compiler-time constant?
Dr. Zim
@Dr. Zim: because DateTime can't be declared as const. I don't know why that's the way it is.
Brian R. Bondy
+4  A: 

The only way you can do this directly is to use the value default(DateTime), which is compile-time constant. Or you can work around that by using DateTime? and setting the default value to null.

See also this related question about TimeSpan.

svick
A: 

Unlike VB, C# doesn't support date literals. And since optional parameters look like this in IL, you can't fake it with attributes.

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