Как установить постоянное десятичное значение - PullRequest
20 голосов
/ 06 августа 2009

Я использую C # для установки значения по умолчанию для десятичного значения в моем классе конфигурации

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

но он не будет скомпилирован и выдает ошибку

Аргументом атрибута должно быть константное выражение, typeof expression

Я нашел сообщение, в котором говорится: "Это не ошибка." 1000M "- это просто сокращение от" new Decimal (1000) ", которое включает вызов метода, что означает, что он не считается константой. compile позволяет вам притворяться, что это константа большую часть времени, но это не значит, что вы можете все время. "

Теперь, как мне это обойти?

Ответы [ 4 ]

11 голосов
/ 06 августа 2009

Я наконец узнал, что я ввожу "440" вместо 440 м или 440. Он скомпилирован и работает хорошо

5 голосов
/ 29 сентября 2010

Я обнаружил, что если установить значение по умолчанию для десятичного свойства и указать это значение в кавычках, оно не будет работать для меня с элементом управления WinForms и .NET 3.5.

Когда я щелкал правой кнопкой мыши свойство в окне «Свойства» конструктора и выбирал опцию «Сброс», я получал сообщение «Объект типа« System.String »не может быть преобразован в тип« System.Decimal ».

Чтобы заставить его работать, я должен был использовать тот же код, который предложил tphaneuf, т.е.

[DefaultValue(typeof(Decimal), "440")]
public decimal TestValue { get; set; }
2 голосов
/ 06 августа 2009

Просто используйте 440 и пропустите букву «М». Я не получаю ошибок компиляции, и эта программа работает как ожидалось:

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; }
        }
    }
}
1 голос
/ 06 октября 2009

Вы должны поместить 440 внутри кавычек, например:

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