2009-08-06 2 views
19

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

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

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

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

Я нашел пост говорит: «. это не ошибка„1000M“это просто сокращение для„нового Decimal (1000)“, которая включает в себя вызов метода , что означает 's не считается константой. Просто потому, что компиляция позволяет делать вид, что постоянная большую часть времени, не означает, что вы можете все время «.

Теперь, как я обойти его?

+0

См http://stackoverflow.com/questions/6942803/why-c-sharp-decimals-cant-be -initialized-without-the-m-suffix – Slugart

ответ

2

Просто используйте 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; } 
     } 
    } 
} 
+0

Он скомпилирован, но ошибка anthoer возникает при запуске приложения Значение по умолчанию для свойство «paymentInAdvanceAmount» имеет другой тип, отличный от самого свойства – ldsenow

+0

. Я не вижу, как, код выше работает просто отлично. –

+0

Возможно, вы могли бы опубликовать код, который показывает нам проблему? –

10

я, наконец, узнал его я ввожу «440» вместо 44ого или 440. Он был составлен и хорошо работает

+3

Это не постоянное десятичное значение. * Но * атрибут DefaultValue не принимает десятичный атрибут, он просто преобразует его позже. Имея Атрибут с явным десятичным параметром, он снова будет бросать ... –

0

Вы должны разместить 440 внутренних квот Тион знаки, как это:

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

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

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

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

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

Я просто столкнулся с той же проблемой в .Net 4.0. Мне нужно было установить DefaultValue в decimal.MaxValue.Я не уверен, как Codeplex будет обертывать это, но это должно быть записано как: [DefaultValue (typeof (decimal), "79228162514264337593543950335")] public decimal StockLimit {get; задавать; } – midspace