2017-04-19 67 views
1

下面的代碼給出了「FileNameSizeDelimiteC必須是常量」的問題,問題是什麼?FileNameSizeDelimiteC必須是常量

public const char FileNameSizeDelimiterC = '|'; 
public const string FileNameSizeDelimiter = Char.ToString(FileNameSizeDelimiterC); 

回答

1

問題是,Char.ToString是一種方法,所以就編譯器而言,它不是恆定的。編譯器在編譯時不會運行任何代碼。儘管事實上你或我可能會這樣看,並且說「編譯器不能這樣做,它總是一樣的」。原因在於它不知道Char.ToString將始終爲相同的輸入返回相同的輸出。它同樣可以是依賴於配置變量,一天中的時間或任何其他事物的東西。雖然語言開發人員可能已經包含了一種方法來標記方法,編譯器可以這樣做,但他們並沒有讓你的const必須是const。

我假設在這種情況下的代碼是示例代碼,所以你不能只使用"|"這似乎是相同的東西?

3

Char.ToString是一個函數,因此必須在運行時調用以獲取該值,這意味着您無法將其存儲在const值中。從文檔(重點煤礦):

常量表達式是可以在編譯時充分求值的表達式。因此,引用類型常量的唯一可能值是字符串和空引用。

你可以不過讓readonly

public const char FileNameSizeDelimiterC = '|'; 
public readonly string FileNameSizeDelimiter = Char.ToString(FileNameSizeDelimiterC);