2012-12-12 10 views
8

Stworzyłem C# Windows Runtime składnik i następujący wiersz:Stałe publiczne w WinRT Biblioteka komponentów

public const bool LOG_ENABLED = false; 

rzuca błąd:

typu „Stałe” zawiera stałe widoczne z zewnątrz stałym polu” .LOG_ENABLED ". Stałe mogą pojawiać się tylko w wyliczeniach Runtime w systemie Windows.

Co oznacza ten błąd? I jak mogę zadeklarować stałe?

+2

Gotowy do pracy: Wykonano wewnętrzny zamiast publiczny, co w tym przypadku uważam za poprawny modyfikator widoczności. – csaam

+1

Kilka wskazówek: Stałe .NET i C# nie są wielkimi literami (ponieważ nie jest to procesor przedprocesorowy), powinny korzystać z TitleCase. Po drugie należy kontrolować rejestrowanie za pomocą parametru konfiguracyjnego, a nie stałej. – Dai

+2

Trochę stare, ale powinieneś opublikować swoje rozwiązanie jako odpowiedź i zaakceptować je, aby ludzie mogli zobaczyć to pytanie. – BlargleMonster

Odpowiedz

4

To jest stare pytanie, ale podam moje dwa centy za mniej. const i public to niebezpieczna kombinacja, której często brakuje. Wynika to z faktu, że jeśli publiczne zmienne pole zostanie zmienione w bibliotece, biblioteka nie może być po prostu zastąpiona, ale wszystkie klienty tej biblioteki muszą zostać przebudowane, ponieważ skopiowałoby to rzeczywistą wartość w kliencie, a nie odniesienie do tej wartości.

Jedną z opcji jest coś jak to zrobić, jeśli naprawdę chciał publiczne „stały”:

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

Jednak to również nie w składniku biblioteki WinRT

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

Inną alternatywą, która ma rzeczywiście praca jest

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

Nie jestem do końca pewien, dlaczego nie jest możliwe v publiczną stałą lub tylko do odczytu w bibliotece komponentów WinRT, ponieważ jest to możliwe w normalnej bibliotece klas.

Po pewnym odczycie wydaje się, że pola publiczne są ograniczone do struktur, a znaki mogą zawierać tylko pola publiczne.

Tak jak powiedziałeś w komentarzach, zmiana na wewnętrzną była dobrym rozwiązaniem, jeśli nie używasz go z zewnętrznego źródła.

+0

public static bool LOG_ENABLED {get {return false; }} nie musi być w klasie statycznej. Może być w dowolnej zapieczętowanej klasie biblioteki komponentów WinRT. – Hong