Search code examples
c#optional-parametersreference-type

How can I create an optional DateTime parameter?


I have this function that returns a reference type. Now, this function has two optional parameters both of which are instances of the DateTime class. The function is something like this:

public DateTime GetDate(DateTime start = DateTime.MinValue, DateTime end = DateTime.MinValue)
{
    // Method body...
}

The error from VS is:

Default parameter value for 'start' must be a compile-time constant

Of course, the error applies to the second parameter and I perfectly understand what is happening.

What I really want is to know if there is a way to go about this, that is, having optional parameters in the method. Right now, what I have done is to create an overload; I mean, I have created a parameterless function GetDate() and a two-parameter overload of it.

This is not really a problem but I just want to know if there is a way to do it.


Solution

  • One workaround is to assign them like this:

    public DateTime GetDate(DateTime? start = null, DateTime? end = null){
        start = start ?? DateTime.MinValue;
        end = end ?? DateTime.MinValue;
    
        Console.WriteLine ("start: " + start);
        Console.WriteLine ("end: " + end);
        return DateTime.UtcNow;
    }
    

    Which can be used like this:

    void Main()
    {
        new Test().GetDate();
        new Test().GetDate(start: DateTime.UtcNow);
        new Test().GetDate(end: DateTime.UtcNow);
        new Test().GetDate(DateTime.UtcNow, DateTime.UtcNow);
    }
    

    And works just as expected:

    start: 1/01/0001 0:00:00
    end: 1/01/0001 0:00:00
    
    start: 8/08/2014 17:30:29
    end: 1/01/0001 0:00:00
    
    start: 1/01/0001 0:00:00
    end: 8/08/2014 17:30:29
    
    start: 8/08/2014 17:30:29
    end: 8/08/2014 17:30:29
    

    Note the named parameter to distinguish between the start and end value.