Как создать необязательный параметр DateTime?

у меня есть эта функция, которая возвращает ссылку на тип. Теперь эта функция имеет два необязательных параметра, оба из которых являются экземплярами DateTime класса. Функция примерно такая:

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

ошибка от VS:

значение параметра по умолчанию для 'start' должно быть константой времени компиляции

конечно, ошибка относится ко второму параметру, и я прекрасно понимаю, что происходит.

Что Я действительно хочу знать, есть ли способ сделать это, то есть иметь необязательные параметры в методе. Прямо сейчас, то, что я сделал, - это создать перегрузку; я имею в виду, я создал функцию без параметров GetDate() и двухпараметровая перегрузка.

это не проблема, но я просто хочу знать, есть ли способ сделать это.

4 ответов


один обходной путь-назначить их следующим образом:

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;
}

который можно использовать следующим образом:

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

и работает так, как ожидалось:

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

обратите внимание на именованный параметр, чтобы различать start и end значение.


кстати, вам не нужно использовать nullable datetime, как и все другие ответы. Вы можете сделать это с помощью DateTime а также:

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;
}

это маловероятно, но это не будет работать, как ожидалось, если вы фактически передадите значение datetime по умолчанию своей функции.


вы можете установить DateTime быть nullable, а затем преобразовать в DateTime.Min если параметр не указан:

public DateTime GetDate(DateTime? start = null, DateTime? end = null) {
    var actualStart = start ?? DateTime.Min;
    var actualEnd = end ?? DateTime.Min;
}

единственный способ сделать это так (немного больше кода, но он дает вам дополнительные args):

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

    //same for end
}