web-dev-qa-db-ja.com

一定の小数値を設定する方法

C#を使用して、構成クラスの10進値のデフォルト値を設定しています

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

しかし、それはコンパイルされず、エラーをスローします

属性引数は定数式、typeof式である必要があります

「バグではありません。「1000M」は「newDecimal(1000)」の省略形であり、メソッド呼び出しが含まれているため、定数とは見なされません。コンパイルにより、ほとんどの場合、一定のふりをしますが、常にできるという意味ではありません。 "

さて、どうすればそれを回避できますか?

20
ldsenow

440mや440ではなく「440」と入力したことがようやくわかりました。コンパイルされて正常に動作します。

11
ldsenow

10進数のプロパティにデフォルト値を設定し、その値を引用符で囲んで指定した場合、WinFormsコントロールと.NET3.5では機能しないことがわかりました。

デザイナの[プロパティ]ウィンドウでプロパティを右クリックして[リセット]オプションを選択すると、「タイプ「System.String」のオブジェクトをタイプ「System.Decimal」に変換できません」というメッセージが表示されました。

それを機能させるには、tphaneufが提案したのと同じコードを使用する必要がありました。

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

次のように、440を引用符で囲む必要があります。

[ConfigurationProperty("paymentInAdvanceAmount", DefaultValue = "440")]
3
geoser

440を使用し、「M」を省略します。コンパイルエラーは発生せず、このプログラムは期待どおりに機能します。

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
Ed S.