2013-05-09 13 views
6

Prawdopodobnie ma proste wyjaśnienie mam uszkodzoną zobaczyć, ale dlaczego jest następujący kod prawna:dynamiczny const pole vs. dowolnym stare pole odniesienia zachowania const

public struct Foo 
    { 
     const object nullObject = null; 

     public override string ToString() 
     { 
      if (nullObject == null) 
      { 
       return base.ToString(); 
      } 

     } 
    } 

Choć dodaje,

public struct Foo 
    { 
     const dynamic nullObject = null; 

     public override string ToString() 
     { 
      if (nullObject == null) 
      { 
       return base.ToString(); 
      } 

     } 
    } 

podaje następujący błąd czasu kompilacji: Foo.ToString() ": nie wszystkie ścieżki kodu zwracają wartość?

Dlaczego fakt, że nullObject jest dynamic powoduje, że kompilator nie może potwierdzić, że nullObject będzie zawsze null?

EDIT: Rozwijając na pytanie oraz na podstawie smoore's odpowiedź, dlaczego kompilator pozwoli dynamicconst pola zacząć? Czy to nie jest rodzaj samoobrony? Wiem, że ten scenariusz nie ma prawdziwego zastosowania i jest zupełnie bezsensowny, ale natknąłem się na niego przez zwykły wypadek i po prostu byłem ciekawy.

+1

'dlaczego kompilator zezwala na uruchamianie zmiennych dynamicznych? 'Ponieważ technicznie pozwala on na zastosowanie' const' do dowolnego typu pola. Podobnie jak w przypadku każdej funkcji, pytanie nie brzmi: "dlaczego nie wdrożyli tej funkcji, której chcę?" "dlaczego mieliby wdrożyć tę funkcję, której chcę?" W tym przypadku funkcja polega na wyraźnym zakazie, aby pole 'const' było' dynamic'. Podobnie jak w przypadku większości żądań funkcji, najprawdopodobniej odpowiedź brzmiałaby: "po prostu nie jest warta czasu i wysiłku, a do dodania ważniejszych funkcji". To całkiem nie pasuje, aby strzelić sobie w stopę. – Servy

Odpowiedz

6

Ponieważ obiekty dynamic nie są rozwiązywane podczas kompilacji, więc kompilator nie ma pojęcia, że ​​zawsze będzie mieć wartość NULL. Obiekt dynamiczny nie zostanie rozwiązany przed uruchomieniem.

EDIT:

widzę swój błąd, dlaczego nawet pozwolić const dynamikę?

Domyślam się, że dynamiczne można zmienić na typ nie podlegający zerowaniu, w którym to przypadku funkcja ToString nie zwróci wartości, ale to tylko przypuszczenie. Myślę też, że nadal możesz chcieć mieć stałą dynamikę, abyś mógł upewnić się, że wartość nie zmieni się poza statycznym konstruktorem, ale nie znamy typu do czasu wykonania.

Inną możliwością, jak podkreśla Servy, jest to, że jest to narożna obudowa, której nie warto naprawiać.

+0

Rozumiem to, ale dlaczego, dlaczego zezwolić na 'dynamic'' const' pola? Chodzi o to, że 'const' nie może być bardziej statyczny. – InBetween

+0

@Tejas: Nie, ten kod się nie skompiluje. Odnośniki do zmiennych stałych mogą być inicjowane tylko do 'null' z wyjątkiem' string', który zawsze był specjalną 'klasą'. Typy wartości można zainicjować tylko na podstawie ciągłych wyrażeń. – InBetween

+0

@Tejas Poza tym, że wartości 'const' muszą być obliczane podczas kompilacji, więc nie mogą wywoływać żadnych metod. –

Powiązane problemy