2015-02-13 24 views
9

stavo sperimentando con il modificatore const durante l'esplorazione di una pletora di C# tutorial, e posto un mazzo di const modificatori in una classe come questa senza utilizzare ovunque:Confondere avvertimento circa un campo decimale costante in C#

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

Con questa classe, ottengo il seguente avviso (utilizzando csc):

ConstTesting.cs (3,19): CS0414 avviso: il campo 'ConstTesting.somedecimal' viene assegnato ma il suo valore non viene mai utilizzato

Quello che non capisco è che ho solo l'avvertimento per la const decimal. Il const int non mi dà alcun avvertimento, indipendentemente dall'ordine o qualcosa del genere.

La mia domanda è, perché succede? Perché il mio compilatore csc dovrebbe avvertirmi di un const in primo luogo, e se è più importante allora perché mi avviserebbero solo di const decimal quando sto scrivendo const int esattamente nello stesso modo? Cosa diavolo farebbe la differenza tra int e decimal?

Si prega di notare:

    - Non ho ReSharper
    - Sto usando CONTRO 2010
    - Sono sicuro al 100% né `const` viene utilizzato ovunque nel mio codice.

+2

Lasciami indovinare. Da qualche parte in quel codice '...', stai usando 'someint' ma non' somedecimal'. È piuttosto sorprendente, ma se non stai usando un valore che hai assegnato ottieni (aspettalo) .. un avvertimento che ti dice che è assegnato ma non usato! Sorprendente, non è vero? –

+0

Sono certo che non sto usando nessuno dei due in realtà. – HavelTheGreat

+0

Sono quasi certo che lo sei! Prova 'public class Foo {const int bar = 2;}', vedrai. –

risposta

12

Int è un tipo di valore semplice di una dimensione fissa. Il decimale è un po 'più complicato a causa delle dimensioni. Se decompilare il codice, troverete che assomiglia a questo:

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

private const int someint = 2; 

Qualora il decimale non è una costante, ma è attribuire una DecimalConstant per gentile concessione di mscorlib.dll, dove la vera definizione se decimale è:

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

Molto più profonda esplorazione di questo argomento è trattato in this blog post.

+0

Questo porta a un'altra domanda se la modifica del valore di 'const decimal' è un cambiamento di rottura come cambiare il valore di' const int'. – tia

+2

Questo è interessante. Quindi stai dicendo che l'uso di un 'const decimal' non è in realtà un" reale "' const'? Inoltre, molte grazie per non dirmi solo che sono un idiota e che ho usato il mio "qualcosa" da qualche parte. – HavelTheGreat

+0

Questo è tecnicamente corretto. L'attributo DecimalConstant dovrebbe far rispettare il comportamento di una costante, ma è un po 'di fumo e specchi per mantenere le cose semplici. La tua domanda è stata un po 'più complicata a prima vista. Ovviamente la soluzione è usare le tue costanti. :) – aRBee

Problemi correlati