2012-12-12 117 views
8

我創建了一個C#Windows Runtime組成部分,下面一行:公共常量

public const bool LOG_ENABLED = false; 

拋出一個錯誤:

類型「常量」包含外部可見的恆場「常量.LOG_ENABLED」。常量只能出現在Windows運行時枚舉

這個錯誤是什麼意思?我怎樣才能聲明常量?

+2

得到它的工作:讓它內部而不是公共,這是我認爲在這種情況下正確的可見性修改器。 – csaam

+1

一些提示:在.NET和C#中常量不是大寫(因爲它不是預處理器),它們應該使用TitleCase。其次,你應該用一個配置參數來控制日誌,而不是一個常量。 – Dai

+2

有點舊,但你應該發佈你的解決方案作爲答案,並接受它,以便人們可以看到這個問題得到解答。 – BlargleMonster

回答

4

這是一個古老的問題,但我給我的兩美分不少。 const和public是一個危險的組合,經常會錯過使用。這是因爲如果庫中的公共常量字段發生更改,庫不能被替換,而是需要重建該庫的所有客戶端,因爲它將複製客戶端中的實際值而不是參考到那個價值。

一種選擇是,做這樣的事情,如果你真的想要一個公共的「常量」:

public static class Constants 
{ 
    public static readonly bool LOG_ENABLED = false; 
} 

但是這也沒有在WinRT的組件庫

'WindowsRuntimeComponent1.Constants' contains externally visible field 'System.Boolean WindowsRuntimeComponent1.Constants.LOG_ENABLED'. Fields can be exposed only by structures.

另一種替代方案,確實工作

public static class Constants 
{ 
    public static bool LOG_ENABLED { get { return false; } } 
} 

我不知道是什麼原因,不可能對哈在WinRT組件庫中有一個公共常量或只讀,因爲它可能在一個普通的類庫中。

經過一番閱讀,似乎公共領域僅限於結構和結構可能只包含公共領域。

就像你在評論中所說的那樣,如果你不從外部來源使用它,將其改爲內部是一個不錯的選擇。

+0

public static bool LOG_ENABLED {get {return false; }}不必處於靜態類中。它可以在WinRT組件庫的任何密封類中。 – Hong