22

我正在使用 C# 在我的配置类中为十进制值设置默认值

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

但它不会被编译并引发错误

属性参数必须是常量表达式,typeof 表达式

我发现一个帖子说:“这不是一个错误。“1000M”只是“new Decimal(1000)”的简写,它涉及一个方法调用,这意味着它不被认为是一个常量。只是因为编译让你假装它是一个大部分时间保持不变,并不意味着你可以一直保持不变。”

现在,我该如何解决它?

4

4 回答 4

12

我终于发现我输入“440”而不是 440m 或 440。它被编译并运行良好

于 2009-08-06T00:53:54.863 回答
5

我发现,如果您为小数属性设置默认值并在引号中指定该值,则它不适用于 WinForms 控件和 .NET 3.5。

当我右键单击设计器“属性”窗口中的属性并选择“重置”选项时,我收到消息“'System.String' 类型的对象无法转换为'System.Decimal' 类型。

为了让它工作,我不得不使用与 tphaneuf 建议的相同的代码,即

[DefaultValue(typeof(Decimal), "440")]
public decimal TestValue { get; set; }
于 2010-09-29T16:17:32.970 回答
4

您应该将 440 放在引号内,如下所示:

[ConfigurationProperty("paymentInAdvanceAmount", DefaultValue = "440")]
于 2009-10-06T14:23:59.507 回答
1

只需使用 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; }
        }
    }
}
于 2009-08-06T00:25:02.310 回答