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)」の省略形であり、メソッド呼び出しが含まれているため、定数とは見なされません。コンパイルにより、ほとんどの場合、一定のふりをしますが、常にできるという意味ではありません。 "
さて、どうすればそれを回避できますか?
440mや440ではなく「440」と入力したことがようやくわかりました。コンパイルされて正常に動作します。
10進数のプロパティにデフォルト値を設定し、その値を引用符で囲んで指定した場合、WinFormsコントロールと.NET3.5では機能しないことがわかりました。
デザイナの[プロパティ]ウィンドウでプロパティを右クリックして[リセット]オプションを選択すると、「タイプ「System.String」のオブジェクトをタイプ「System.Decimal」に変換できません」というメッセージが表示されました。
それを機能させるには、tphaneufが提案したのと同じコードを使用する必要がありました。
[DefaultValue(typeof(Decimal), "440")]
public decimal TestValue { get; set; }
次のように、440を引用符で囲む必要があります。
[ConfigurationProperty("paymentInAdvanceAmount", DefaultValue = "440")]
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; }
}
}
}