[英]Can't declare const field in class
請注意,我並不是在問const , readonly和static之間的區別。 我認為從問題的內容來看是很清楚的,但是顯然我沒有足夠清楚地說明這一點。
我知道當使用關鍵字const聲明常量時 ,我必須在編譯時指定一個值,並且該值必須是常量。
以下示例有效,但我發現它有點冗長且不必要地放松,因此我嘗試將字段聲明為constant 。 據我估計,我們對內容確實有一個固定的說明,並且這些內容永遠都不會改變。
static readonly List<int> Codes = new List<int> { 1337 };
顯然,根據計算機,不是,並且nit-picker無法編譯以下示例。 這與我的預期相矛盾,我對計算機的數字還不清楚。 因此,問題-為什么不喜歡呢?
const List<int> Codes = new List<int> { 1337 };
正如人們所期望的那樣,確切的表述是: 常量初始化程序必須是編譯時常量,但這可以回答錯誤的原因 。 它並沒有真正解釋非恆定部分在哪里 。
const
必須是compile-time
時常量,因為其值將嵌入在發出的中間語言(IL)代碼中 。
這里是new List<int> { 1337 };
是在運行時運行的指令。 編譯器無法嵌入此new List<int> { 1337 };
在IL中不運行代碼實際創建列表 。
有關更多信息: 如何阻止C#用其值替換const變量?
const
必須是compile-time
時常量。 如果執行new Something()
則不會。 請參閱此處的 MSDN參考。
但是您可以像看到的那樣將其聲明為static
,而不必為常數。
現在,字段值必須是compile-time-constant
意味着它的值必須是已知的,並且在編譯時本身是恆定的。 但是,當您調用類的constructor
時,實際對象將在run-time
創建,因此編譯器不知道。
例:
const string Allowed = "hello!";
const string NotAllowed = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.