如何创建可选的DateTime参数?

时间:2014-08-08 17:26:51

标签: c# optional-parameters reference-type

我有这个函数返回一个引用类型。现在,这个函数有两个可选参数,它们都是DateTime类的实例。功能是这样的:

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

VS的错误是:

  

'开始'的默认参数值必须是编译时常量

当然,错误适用于第二个参数,我完全理解发生了什么。

我真正想要的是知道是否有办法解决这个问题,即在方法中有可选参数。现在,我所做的就是创造一个过载;我的意思是,我创建了一个无参数函数GetDate()和一个双参数重载。

这不是一个真正的问题,但我只是想知道是否有办法做到这一点。

4 个答案:

答案 0 :(得分:17)

一种解决方法是像这样分配它们:

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

请注意命名参数,以区分startend值。

答案 1 :(得分:5)

顺便说一下,你不必像所有其他答案一样使用可空的日期时间。您也可以使用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;
}

这种情况不太可能,但如果您确实将默认日期时间值传递给您的函数,它将无法按预期工作。

答案 2 :(得分:3)

如果没有提供参数,您可以将DateTime设置为可为空,然后转换为DateTime.Min

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

答案 3 :(得分:2)

唯一的方法是这样做(更多的代码,但它给你可选的args):

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

    //same for end
}