110

How can I set default value for DateTime in optional parameter?

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???)
{
    //Init codes here
}
PiotrWolkowski
  • 8,408
  • 6
  • 48
  • 68
Sadegh
  • 4,181
  • 9
  • 45
  • 78
  • 1
    This is not a duplicate Timespans work differently in c# than timespans. This is doable in c# with `DateTimeConstantAttribute` but timespans do not support this. – leat May 04 '17 at 20:56

6 Answers6

167

There is a workaround for this, taking advantage of nullable types and the fact that null is a compile-time constant. (It's a bit of a hack though, and I'd suggest avoiding it unless you really can't.)

public void SomeClassInit(Guid docId, DateTime? addedOn = null)
{
    if (!addedOn.HasValue)
        addedOn = DateTime.Now;

    //Init codes here
}

In general, I'd prefer the standard overloading approach suggested in the other answers:

public SomeClassInit(Guid docId)
{
    SomeClassInit(docId, DateTime.Now);
}

public SomeClassInit(Guid docId, DateTime addedOn)
{
    //Init codes here
}
LukeH
  • 263,068
  • 57
  • 365
  • 409
  • 1
    I don't really understand why optional params must be compile-time constants. The compiler could easily create the 2 methods you wrote from the one with the optional param...I usually prefer having one method with several optional params instead of several methods, it makes the code smaller and thus easier to read. – user276648 May 22 '12 at 08:48
  • 8
    You can use coalesce here: `addedOn = addedOn ?? DateTime.Now` – Zaid Masud Sep 19 '12 at 20:36
  • Nullables can cause casting problems deep in your code, so I am not a fan. I am becoming increasing disappointed in C#. I mean, even VB.net has literal dates, such as: Optional addedOn As DateTime = #12:00:00 PM# – Brain2000 Mar 03 '14 at 17:40
  • 2
    VS wouldnt compile with this code. Instead i used DateTime date = default(DateTime), and then checked to see if date==default(DateTime) – Dan Hastings Sep 07 '16 at 10:18
59

I guess that you did not really want addedOn = DateTime.Now because that would suggest you never get any result as everything would be added before 'Now'. :)

A default DateTime can be set like this:

public void SomeClassInit(Guid docId, DateTime addedOn = default(DateTime))

Update
If you deal with SQL Server, do not forget that it doesn't accept default(DateTime) what is 1/1/0001. SQL Server's minimal DateTime is 1/1/1753 (explanation). SQL's DateTime2 accepts 1/1/0001, though.

Community
  • 1
  • 1
Rick Glimmer
  • 761
  • 6
  • 4
29

I'd slightly modify LukeH's solution as:

public void SomeClassInit(Guid docId, DateTime? addedOn = null)
{
    DateTime TargetDateTimeProperty = addedOn ?? DateTime.Now;
}

which is shorter and more readable, it seems.

7

Don't use an optional parameter:

public SomeClassInit(Guid docId, DateTime addedOn)
{
    SomeClassInitCore(docId, addedOn);
}

public SomeClassInit(Guid docId)
{
    SomeClassInitCore(docId, null);
}

private SomeClassInitCore(Guid docId, DateTime? addedOn)
{
    // set default value
    if (addedOn.IsNull) addedOn = DateTime.Now;

    //Init codes here
}
munificent
  • 11,946
  • 2
  • 38
  • 55
6

.NET 4.0 does have optional parameters. (google is also your friend, here.)

EDIT (because of Anthony Pegram correct, comment)...

And yes, that is how you would do it.

But DateTime.Now (static property, on that class) is not know until run-time. As such, you can't use that as an optional value.

.NET 3.5 doesn't ... so then you would have to do what JS Bangs said...

public SomeClassInit(Guid docId) 
{ 
    return SomeClassInit(docId, DateTime.Now);
}

public SomeClassInit(Guid docId, DateTime addedOn = DateTime.Now???) 
{ 
    //Init codes here 
}

or even the null checking/null value parameter from munificent's answer.

Cheers Anthony.

Pure.Krome
  • 84,693
  • 113
  • 396
  • 647
2

C# doesn't have optional parameters in this sense. If you want to make addedOn optional, you should write an overload that doesn't require that parameter, and passes DateTime.Now to the two-argument version.

JSBձոգչ
  • 40,684
  • 18
  • 101
  • 169