2009-08-06 24 views
19

Tôi đang sử dụng C# để đặt một giá trị mặc định cho một giá trị thập phân trong lớp cấu hình của tôiLàm thế nào để thiết lập một giá trị thập phân liên tục

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

nhưng nó sẽ không được biên dịch và ném một lỗi

một cuộc tranh cãi thuộc tính phải là một biểu thức hằng số, typeof biểu

tôi tìm thấy một bài nói: ". đó không phải là lỗi '1000M' chỉ đơn thuần là viết tắt cho 'Decimal mới (1000)', trong đó bao gồm một phương pháp gọi , có nghĩa là nó không được coi là một hằng số. Chỉ vì các biên dịch cho phép bạn giả vờ đó là một phần lớn liên tục của thời điểm đó, không có nghĩa là bạn có thể tất cả thời gian."

Bây giờ, làm thế nào để workaround nó?

+0

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

Trả lời

2

Chỉ cần sử dụng 440 và bỏ qua . 'M' tôi nhận được không có lỗi biên soạn, và chương trình này hoạt động như mong đợi:

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

Nó được biên dịch nhưng lỗi anthoer xảy ra khi chạy ứng dụng Giá trị mặc định cho tài sản 'paymentInAdvanceAmount' có loại khác với loại tài sản của chính nó – ldsenow

+0

Tôi không thấy làm thế nào, mã trên chỉ hoạt động tốt. –

+0

Có lẽ bạn có thể đăng một số mã trong đó cho chúng ta thấy vấn đề sau đó? –

10

cuối cùng tôi phát hiện ra nó tôi nhập "440" thay vì 440 triệu hoặc 440. nó đã được biên dịch và chạy tốt

+3

Đó không phải là giá trị thập phân không đổi. * Nhưng * thuộc tính DefaultValue-Attribute không lấy một số thập phân làm thuộc tính, nó chỉ chuyển đổi nó sau này. Có một thuộc tính với một tham số thập phân rõ ràng nó sẽ ném một lần nữa ... –

0

Bạn nên đặt 440 bên trong hạn ngạch dấu tion, như thế này:

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

Tôi thấy rằng nếu bạn đặt một giá trị mặc định cho một tài sản thập phân và xác định giá trị trong dấu ngoặc kép, nó không làm việc cho tôi với một điều khiển WinForms và .NET 3.5.

Khi nào tôi nhấp chuột phải vào thuộc tính trong cửa sổ "Thuộc tính" của nhà thiết kế và chọn tùy chọn "Đặt lại", tôi nhận được thông báo "Loại đối tượng 'System.String' không thể chuyển đổi thành loại 'System.Decimal'.

để có được nó để làm việc tôi đã phải sử dụng mã tương tự như tphaneuf gợi ý tức là

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

Tôi chỉ chạy vào cùng một vấn đề, trong .Net 4.0. Tôi cần thiết đặt DefaultValue thành decimal.MaxValue.Tôi không chắc chắn Codeplex sẽ bao bọc nó như thế nào, nhưng nó phải được viết là: [DefaultValue (typeof (thập phân), "79228162514264337593543950335")] thập phân công khai StockLimit {get; bộ; } – midspace

Các vấn đề liên quan