2009-08-06 18 views
19

estoy usando C# para establecer un valor predeterminado para un valor decimal en mi clase de configuraciónCómo establecer un valor constante decimal

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

pero no se compila y se genera un error

un argumento atributo debe ser una expresión constante, typeof expresión

me encontré con un post dice: ". no es un error '1000M' no es más que la abreviatura de 'nueva decimal (1000)', lo que implica una llamada de método , lo que significa no se considera una constante El hecho de que la compilación le permite pretender que es una constante mayor parte del tiempo, no significa que usted puede todo el tiempo ".

Ahora, ¿cómo puedo solucionar esto?

+0

Ver http://stackoverflow.com/questions/6942803/why-c-sharp-decimals-cant-be -inicializado-sin-el-sufijo – Slugart

Respuesta

2

Sólo tiene que utilizar 440 y dejar de lado . 'M' no consigo ninguna errores de compilación, y este programa funciona como se esperaba:

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

Se compiló pero se produce un error al ejecutar la aplicación El valor predeterminado para la propiedad 'paymentInAdvanceAmount' tiene un tipo diferente al de la propiedad en sí – ldsenow

+0

No veo cómo, el código anterior funciona bien. –

+0

¿Tal vez podría publicar algún código que nos muestre el problema, entonces? –

10

finalmente descubrí que entro "440" en lugar de 440m o 440. ¡Gracias compilan y funciona bien

+3

Eso no es un valor decimal constante. * Pero * el DefaultValue-Attribute no toma un decimal como atributo, simplemente lo convierte más tarde. Tener un Atributo con un parámetro decimal explícito arrojará nuevamente ... –

0

Debe colocar 440 dentro de la cuota marcas ción, así:

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

He descubierto que si se establece un valor predeterminado de una propiedad decimal y ha especificado que el valor entre comillas, no funcionó para mí con un control de Windows Forms y .NET 3.5.

Cuando hice clic con el botón derecho en la propiedad en la ventana de diseñador de "Propiedades" y seleccioné la opción "Restablecer" recibí el mensaje "Objeto de tipo 'System.String' no puede convertirse a tipo 'System.Decimal'.

para conseguir que funcione tuve que usar el mismo código que sugirió tphaneuf es decir

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

Acabo de encontrarme con el mismo problema, en .Net 4.0. Necesitaba establecer DefaultValue en decimal.MaxValue.No estoy seguro de cómo Codeplex ajustará esto, pero tuvo que escribirse como: [DefaultValue (typeof (decimal), "79228162514264337593543950335")] public decimal StockLimit {get; conjunto; } – midspace

Cuestiones relacionadas