2015-02-13 15 views
9

I eksperymentował z modyfikatorem const badając mnóstwo C# tutoriale i umieścił kilka const modyfikatorów w klasie jak ten bez faktycznego korzystania z nich w dowolnym miejscu:Mylenie ostrzeżenie o stałym polu przecinku w C#

class ConstTesting 
{ 
    const decimal somedecimal = 1; 
    const int someint = 2; 
    ... 
} 

Dzięki tej klasy, pojawia się następujące ostrzeżenie (używając CSC):

ConstTesting.cs (3,19): CS0414 ostrzeżenie: pole 'ConstTesting.somedecimal' jest przypisany ale jego wartość nie jest używany

Nie rozumiem, że Mam tylko ostrzeżenie dla const decimal. const int nie daje mi żadnego ostrzeżenia, niezależnie od kolejności lub czegoś w tym stylu.

Moje pytanie brzmi, dlaczego tak się dzieje? Dlaczego mój kompilator csc miałby przede wszystkim ostrzec mnie przed const, a jeśli to jest ważniejsze, to , dlaczego ostrzegałoby mnie o const decimal, kiedy piszę const int w dokładnie taki sam sposób? Jaka byłaby różnica między int i ?

Uwaga:

    - Nie mam ReSharper
    - używam VS 2010
    - Jestem w 100% pewien, ani `const` jest używany nigdzie w moim kodu.

+2

Niech zgadnę. Gdzieś w tym kodzie '...' używasz 'someint', ale nie' somedecimal'. To dość zaskakujące, ale jeśli nie używasz wartości, którą wyznaczyłeś, dostajesz (czekasz na to) .. ostrzeżenie mówiące, że jest przypisane, ale nie używane! Zaskakujące, prawda? –

+0

Jestem całkowicie pewien, że właściwie nie używam nigdzie. – HavelTheGreat

+0

Jestem pewien, że jesteś! Wypróbuj 'public class Foo {const int bar = 2;}', zobaczysz. –

Odpowiedz

12

Int to prosty typ wartości o stałym rozmiarze. Dziesiętny jest nieco bardziej skomplikowany ze względu na skalę. Jeśli dekompilacji kodu, przekonasz się, że wygląda to tak:

[DecimalConstant(0, 0, 0, 0, 1)] 
private readonly static decimal somedecimal; 

private const int someint = 2; 

Jeżeli dziesiętny nie jest stała, lecz ma DecimalConstant przypisują uprzejmości pliku mscorlib.dll, gdzie prawdziwa definicja jeśli przecinku wynosi:

public struct Decimal : IFormattable, IComparable, IConvertible, 
IDeserializationCallback, IComparable<decimal>, IEquatable<decimal> 

Znacznie bardziej szczegółowego zbadania tego tematu jest pokryta this blog post.

+0

Prowadzi to do innego pytania, czy zmiana wartości 'const decimal' jest przełamującą zmianą jak zmiana wartości' const int'. – tia

+2

To jest interesujące. Więc mówisz, używając 'const decimal' nie jest tak naprawdę" prawdziwym "' const'? Dziękuję także za to, że nie tylko powiedziałem mi, że jestem idiotą, i gdzieś skorzystałem z mojego "bycia". – HavelTheGreat

+0

To technicznie poprawne. Atrybut DecimalConstant powinien wymuszać zachowanie stałej, ale jest trochę dymu i luster, aby zachować prostotę. Twoje pytanie było nieco bardziej skomplikowane niż na pierwszy rzut oka. Oczywiście rozwiązaniem jest użycie twoich stałych. :) – aRBee

Powiązane problemy