2012-12-12 23 views
8

ho creato un componente C# Windows Runtime, e la seguente riga:costanti pubbliche WinRT Component Library

public const bool LOG_ENABLED = false; 

sta gettando un errore:

Tipo 'Costanti' contiene costanti visibile esternamente costante sul campo' .LOG_ENABLED'. Le costanti possono apparire solo nelle enumerazioni di Windows Runtime

Cosa significa questo errore? E come posso dichiarare le costanti?

+2

Ho funzionato: reso interno invece che pubblico, che in ogni caso penso sia il modificatore di visibilità corretto. – csaam

+1

Alcuni suggerimenti: In .NET e C# le costanti non sono maiuscole (perché non è una cosa pre-processore), dovrebbero usare TitleCase. In secondo luogo, dovresti controllare la registrazione con un parametro di configurazione, non una costante. – Dai

+2

Un po 'vecchio, ma dovresti postare la tua soluzione come risposta e accettarla in modo che le persone possano vedere che questa domanda ha una risposta. – BlargleMonster

risposta

4

Questa è una vecchia domanda, ma non darei i miei due cent non meno. const e public sono una combinazione pericolosa e spesso vengono ignorate. Ciò è dovuto al fatto che se un campo const pubblico viene modificato in una libreria, la libreria non può essere solo sostituita, ma piuttosto tutti i client di tale libreria devono essere ricostruiti poiché avrebbero copiato il valore reale nel client e non il riferimento a quel valore.

Una possibilità è quella di fare qualcosa di simile se si voleva davvero un pubblico "costante":

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

Tuttavia questo non funziona anche nella libreria dei componenti WinRT

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

Un'altra alternativa che fa davvero lavoro è

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

Non sono esattamente sicuro del motivo per cui non è possibile ve un public const o readonly in una libreria di componenti WinRT poiché è possibile in una normale libreria di classi.

Dopo alcune letture sembra che i campi pubblici siano limitati alle strutture e che le strutture possano contenere SOLO campi pubblici.

Come hai detto nei commenti, cambiarlo in interno era una buona opzione se non lo si utilizza da una fonte esterna.

+0

public static bool LOG_ENABLED {get {return false; }} non deve essere in una classe statica. Può essere in qualsiasi classe sigillata di libreria di componenti WinRT. – Hong