2009-08-06 19 views
19

sto usando C# per impostare un valore predefinito per un valore decimale nella mia classe configCome impostare un valore decimale costante

public class ConfigSection : ConfigurationSection 
{ 
     [ConfigurationProperty("paymentInAdvanceAmount", **DefaultValue = 440m**)] 
     public decimal PaymentInAdvanceAmount 
     { 
      get { return (decimal)base["paymentInAdvanceAmount"]; } 
      set { base["paymentInAdvanceAmount"] = value; } 
     } 
} 

ma non verrà compilato e genera un errore

un argomento attributo deve essere un'espressione costante, typeof espressione

ho trovato un post dice: ". non è un bug '1000M' è semplicemente una scorciatoia per 'nuova decimale (1000)', che comporta una chiamata di metodo , il che significa che Non è considerato una costante. Solo perché la compilazione consente di far finta che è una costante il più delle volte, non significa che è possibile per tutto il tempo ".

Ora, come ho aggirare esso?

+0

Vedi http://stackoverflow.com/questions/6942803/why-c-sharp-decimals-cant-be -inizializzato-senza-il-m-suffisso – Slugart

risposta

2

Basta usare 440 e lasciare fuori . la 'M' non ottengo alcuna errori di compilazione, e questo programma funziona come previsto:

namespace WindowsApplication5 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      AttributeCollection attributes = 
       TypeDescriptor.GetProperties(mTextBox1)[ "Foo" ].Attributes;   
      DefaultValueAttribute myAttribute = 
       (DefaultValueAttribute) attributes[ typeof(DefaultValueAttribute) ]; 

      // prints "440.1" 
      MessageBox.Show("The default value is: " + myAttribute.Value.ToString()); 
     } 
    } 

    class mTextBox : TextBox 
    { 
     private decimal foo;  
     [System.ComponentModel.DefaultValue(440.1)] 
     public decimal Foo 
     { 
      get { return foo; } 
      set { foo = value; } 
     } 
    } 
} 
+0

È stato compilato ma si verifica un errore anthoer durante l'esecuzione dell'app Il valore predefinito per la proprietà 'paymentInAdvanceAmount' ha un tipo diverso da quello della proprietà stessa – ldsenow

+0

Non vedo come, il codice sopra funziona perfettamente. –

+0

Forse potresti pubblicare un codice che ci mostri il problema, allora? –

10

ho finalmente scoperto che entro in "440" al posto di 440m o 440. ha ottenuto compilato e funziona bene

+3

Questo non è un valore decimale costante. * Ma * l'attributo DefaultValue non accetta un decimale come attributo, lo converte solo più tardi. Avere un attributo con un parametro decimale esplicito getterà di nuovo ... –

0

È necessario inserire quota interna 440 segni zione, come questo:

[ConfigurationProperty("paymentInAdvanceAmount", DefaultValue = "440")] 
5

ho scoperto che se si imposta un valore predefinito per una proprietà decimale e specificato che il valore tra virgolette, non ha funzionato per me con un controllo di WinForms e .NET 3.5.

Ogni volta che ho fatto clic con il pulsante destro del mouse sulla proprietà nella finestra di dialogo "Proprietà" del designer e ho selezionato l'opzione "Ripristina", ho ricevuto il messaggio "Oggetto di tipo" System.String "non può essere convertito in tipo" System.Decimal ".

per farlo funzionare ho dovuto usare lo stesso codice come tphaneuf suggerito cioè

[DefaultValue(typeof(Decimal), "440")] 
public decimal TestValue { get; set; } 
+0

Ho appena incontrato lo stesso problema, in .Net 4.0. Avevo bisogno di impostare DefaultValue su decimal.MaxValue.Non sono sicuro di come Codeplex lo avvolgerà, ma è stato scritto come: [DefaultValue (typeof (decimale), "79228162514264337593543950335")] decimale pubblico StockLimit {get; impostato; } – midspace

Problemi correlati