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.
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.
Btw, you don't have to use nullable datetime like all other answers says. You can do it with DateTime
as well:
public DateTime GetDate(
DateTime start = default(DateTime),
DateTime end = default(DateTime))
{
start = start == default(DateTime) ? DateTime.MinValue : start;
end = end == default(DateTime) ? DateTime.MinValue : end;
}
This is unlikely but it won't work as expected if you actually pass the default datetime value to your function.
You can set the DateTime
to be nullable and then convert to DateTime.Min
if no parameter is provided:
public DateTime GetDate(DateTime? start = null, DateTime? end = null) {
var actualStart = start ?? DateTime.Min;
var actualEnd = end ?? DateTime.Min;
}
The only way would be to do it like this (a bit more code, but it gives you optional args):
public DateTime GetDate(DateTime? start = null, DateTime? end = null)
{
// Method body...
if(start == null)
{
start = DateTime.MinValue;
}
//same for end
}