簡體   English   中英

如何創建可選的DateTime參數?

[英]How can I create an optional DateTime parameter?

我有這個函數返回一個引用類型。 現在,這個函數有兩個可選參數,它們都是DateTime類的實例。 功能是這樣的:

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

VS的錯誤是:

'start'的默認參數值必須是編譯時常量

當然,錯誤適用於第二個參數,我完全理解發生了什么。

我真正想要的是知道是否有辦法解決這個問題,即在方法中有可選參數。 現在,我所做的就是創造一個過載; 我的意思是,我創建了一個無參數函數GetDate()和它的雙參數重載。

這不是一個真正的問題,但我只是想知道是否有辦法做到這一點。

一種解決方法是像這樣分配它們:

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值。

順便說一下,你不必像所有其他答案那樣使用可空的日期時間。 您也可以使用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.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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM