簡體   English   中英

無法在類中聲明const字段

[英]Can't declare const field in class

請注意,我並不是在問constreadonlystatic之間的區別。 我認為從問題的內容來看是很清楚的,但是顯然我沒有足夠清楚地說明這一點。

我知道當使用關鍵字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.

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