2009-08-06 15 views
19

używam C#, aby ustawić domyślną wartość dla wartości dziesiętnych w klasie configJak ustawić stałą wartość dziesiętną

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

ale nie zostaną skompilowane i zgłasza błąd

Argument atrybut musi być stałym wyrażeniem, typeof ekspresji

znalazłem post mówi: „. to nie jest błąd«1000M»jest tylko skrótem«nowej dziesiętnego (1000)», która obejmuje wywołanie metody , co oznacza to nie jest uważana za stałą. Tylko dlatego, że kompilacji pozwala udawać, że jest to stała przez większość czasu, nie oznacza, że ​​można przez cały czas.”

Teraz, w jaki sposób obejść go?

+0

Zobacz http://stackoverflow.com/questions/6942803/why-c-sharp-decimals-cant-be -initialized-bez-m-sufiksu – Slugart

Odpowiedz

2

Wystarczy użyć 440 i opuścić . „m” otrzymuję żadnych błędów kompilacji, a ten program działa zgodnie z oczekiwaniami:

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

Został skompilowany, ale występuje inny błąd podczas uruchamiania aplikacji. Domyślna wartość dla właściwość "paymentInAdvanceAmount" ma inny typ niż właściwość samej nieruchomości – ldsenow

+0

Nie widzę, jak powyższy kod działa dobrze. –

+0

Być może mógłbyś opublikować kod, który pokazuje nam problem? –

10

końcu znalazłem się go wprowadzić „440” zamiast 440m lub 440. on został skompilowany i działa dobrze

+3

To nie jest stała wartość dziesiętna. * Ale * atrybut DefaultValue nie ma dziesiętnego jako atrybutu, po prostu przekształca go później. Posiadanie Atrybutu z wyraźnym parametrem dziesiętnym spowoduje ponowne wygenerowanie ... –

0

Powinieneś umieścić 440 wewnątrz limitu Znaki tion, na przykład:

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

stwierdziliśmy, że jeśli ustawić wartość domyślną dla właściwości dziesiętnym i określono tę wartość w cudzysłowie, to nie działa na mnie z kontroli WinForms i .NET 3.5.

Kiedy raz prawym przyciskiem myszy kliknąłem na nieruchomości w oknie "Właściwości" projektanta i wybrałem opcję "Resetuj" Otrzymałem komunikat "Obiekt typu" System.String "nie można przekonwertować na typ" System.Decimal ".

aby zmusić go do pracy musiałem użyć tego samego kodu jako tphaneuf zasugerował tj

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

Po prostu wpadłem na ten sam problem, w .Net 4.0. Musiałem ustawić DefaultValue na decimal.MaxValue.Nie jestem pewien, jak Codeplex to zawinie, ale musi być napisany jako: [DefaultValue (typeof (dziesiętny), "79228162514264337593543950335")] public decimal StockLimit {get; zestaw; } – midspace

Powiązane problemy