2016-10-28 34 views
1

我不喜歡標題,methinks。但是忍耐我:我知道爲什麼引用類型本身不能被聲明爲const - 它們在編譯時必須是完全可評估的。因此,引用類型常量的唯一可能值是字符串和空引用。爲什麼DateTime的聲明會給出編譯器錯誤而不是可選參數?

所以它是有道理的,const DateTime x = some date是無效的。但是遵循這個邏輯,我不應該把例如DateTime d1 = default(DateTime)作爲一個可選參數傳遞,就像我不能聲明const DateTime d1 = default(DateTime)一樣,因爲可選參數必須是編譯時常量?這一直是我對「meh,只是它的方式」的態度,但我現在很好奇。

編譯時常量不是編譯時常量嗎?如在,常數是一個常數?

當然,這或許也同樣是我的IDE(Visual Studio中)只是給出了一個錯誤,因爲日期時間不允許作爲const,它會一直爲default(DateTime)null參考編譯罰款?

回答

1

查看關於optional parameters的msdn文章。 當數據類型是值類型(枚舉,結構),你可以發起一個可選的參數有一個空的構造:

static void Foo(string s, DateTime opt = new DateTime()) 

還是用默認的關鍵字。這對於參考類型不適用。

+0

顯然這個問題還不清楚 - 我知道。我問的是什麼(我認爲這是明顯的措詞「不是一個編譯時常量編譯時常量?因爲,常量是一個常量?」)是_why_例如默認(日期時間)'可以作爲可選參數(必須是編譯時常量),但不能聲明爲編譯時常量('const')。兩者都是編譯時常量,在我看來,應該在可選參數(編譯時常量)和常量中沒有區別。但很顯然,因爲一個錯誤而另一個錯誤。 –

+1

當涉及引用類型時,可選參數必須是僅編譯時間常量** **。 'default(DateTime)'不是一個編譯時間常量,所以你不能用它初始化一個const變量,但由於'DateTime'是一個值類型,你可以使用一個空構造函數或者default關鍵字來啓動一個可選參數。 –

+0

啊,這是VS,這是棘手的,說「默認參數值爲'富'必須是一個編譯時常量」。這就是令人困惑的原因,以及爲什麼MSDN文章沒有使它更清晰。沒有意識到可選參數可能不是編譯時常量。你懂得越多!謝謝! –

相關問題