2011-07-28 78 views
25

我想有一個方法的可選日期參數(默認爲MinValue),以檢查用戶是否實際提供了一個值(提供MinValue無效),但我不允許顯然它不是一個編譯時常量。C# - 爲什麼DateTime.MinValue和MaxValue不是編譯時常量?

根據the MSDN page,「該常數的值等於00:00:00.0000000,0001年1月1日」。

那麼,爲什麼編譯時不是常量?爲什麼它不同於傳入Int32.MinValue,這是允許的?

+0

@Downvoter爲什麼downvote?我覺得問題很清楚,有一個確切的答案,並與網站相關。 – Alex

回答

23

您無法定義DateTime常量(或結構)。從MSDN允許的const類型爲:

其中一種類型:byte,char,short,int,long,float,double,decimal,bool,string,枚舉類型或引用類型。

+1

謝謝,這回答我的實際問題! – Alex

+1

@jazmatician DateTime _is_值類型。請參閱http://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx – Vasea

+0

我知道這是錯誤的,當我鍵入它,但不能把我的手指上。 :) –

12

解決方法:使用可爲空的參數。因爲IMO的特殊價值顯然是不同的,而不僅僅是一個正常的價值,所以反正它更清潔。

void A(DateTime? p=null) 
{ 
} 

另一個替代方案是:

void A(DateTime p=default(DateTime)) 
{ 
} 

其中示出了默認參數可用於用戶定義類型default(T)作爲有效的默認參數值。

或者只是爲不同數量的參數重載方法。

+0

這回答了我隱含的問題,'我該怎麼做我想做的事情?',謝謝:) – Alex

+0

你可以嘗試使用['readonly'](http://msdn.microsoft.com/en- us/library/acdd6hb7(v = vs.71).aspx)如果您希望確保該值不會更改。我相信這可以與可空類型['?'](http://msdn.microsoft.com/en-us/library/1t3y8s4s(v = vs80).aspx)結合使用。 – eternalmatt

+0

@eternalmatt我不關注 - 這有什麼幫助有一個可選的DateTime參數?如果它是可選的,它將需要一個默認值,並且由於我無法提供編譯時常量,似乎CodeInChaos的解決方案是最好的。 – Alex

相關問題