2017-04-13 95 views
2

C#4.0的答案不再適用。 < - (對不起,這是錯誤的)我可以使用TimeSpan作爲具有默認值的可選參數嗎?

我該如何使用TimeSpan作爲默認值的可選參數?

public static Foo(string myString, TimeSpan maxWait = TimeSpan.FromSeconds(1)) 
{ 
    // do something 
} 

有了這個代碼,我得到的錯誤:

default parameter must be a compile-time constant

+0

@Patrick爲什麼在標題中刪除「C#7.0」? – kame

+1

因爲它是一個標籤,標籤不應該是標題的一部分。 –

+1

「C#4的答案不再適用」是什麼意思? – Evk

回答

9

這從未在任何C#版本工作。默認值必須是常量。您必須創建一個超載來默認值,或者使其可以爲空,並且如果值爲null,則默認值。

選項1:

public static Foo(string myString) 
{ 
    Foo(myString, TimeSpan.FromSeconds(1)); 
} 

public static Foo(string myString, TimeSpan maxWait) 
{ 
    // do something 
} 

選項2:

public static Foo(string myString, TimeSpan? maxWait = null) 
{ 
    TimeSpan maxWaitNotNull = maxWait ?? TimeSpan.FromSeconds(1); 
    // do something 
} 
1

不能使用一個TimeSpan作爲一個可選參數,這是因爲類TimeSpan沒有聲明任何編譯時間常數元件(這意味着TimeSpan s的成員(如TimeSpan.Zero)不是「硬編碼」的,但需要進行評估,不能在編譯時完成),或者根本不能用作常量。

嘗試,如果以下可能會爲你工作:

void Foo(TimeSpan? span = null) 
{  
    if (span == null) { span = TimeSpan.FromSeconds(2); }  
    ...  
} 

也應爲C#7.0的工作。

取自C# 4.0: Can I use a TimeSpan as an optional parameter with a default value?

+2

您可以始終將'default(TimeSpan)'作爲可選參數。 –

+0

@PatrickHofman是的,你說得對,我說這是錯誤的,我的意思是'TimeSpan.Zero'等成員不是編譯時常量成員,可以用作默認值 –

+1

這不僅僅是'TimeSpan'沒有聲明任何編譯時常量 - 實際上你根本不能聲明類型爲'TimeSpan'的常量。 – Evk

相關問題