2010-07-07 419 views
93

這真的令人難以置信,但真實。此代碼將無法正常工作:爲什麼「decimal」不是有效的屬性參數類型?

[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field)] 
public class Range : Attribute 
{ 
    public decimal Max { get; set; } 
    public decimal Min { get; set; } 
} 

public class Item 
{ 
    [Range(Min=0m,Max=1000m)] //compile error:'Min' is not a valid named attribute argument because it is not a valid attribute parameter type 
    public decimal Total { get; set; } 
} 

雖然這個工程:

[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field)] 
public class Range : Attribute 
{ 
    public double Max { get; set; } 
    public double Min { get; set; } 
} 

public class Item 
{ 
    [Range(Min=0d,Max=1000d)] 
    public decimal Total { get; set; } 
} 

誰能告訴我,爲什麼雙是OK,而小數不是。

+0

的可能重複(HTTP [使用十進制值在c#屬性PARAMS?]://計算器。com/questions/507528/use-decimal-values-as-attribute-params-in-c) – nawfal 2013-06-10 22:46:30

回答

100

這是一個CLR限制。只有 基本常量或 基元數組可以用作屬性 參數。爲什麼 屬性必須完全在 元數據中進行編碼。這與在IL中編碼的方法主體不同。 使用MetaData只能嚴格限制可以使用的值範圍 。 在CLR的當前版本中, 元數據值僅限於 基元,null,類型和基元數組(可能錯過了次要 之一)。

攝影this回答JaredPar

小數而基本類型不是 原始類型並因此不能 表示在元數據中,其防止從一種屬性參數 它。

+23

爲什麼在CLR中小數不被視爲原始類型? – koumides 2012-02-01 16:40:10

+7

@koumides我相信答案是類型是太大,不能在一個單一的CPU寄存器表示,因爲它是128位 – 2016-05-02 19:05:11

+0

好吧,爲什麼字符串允許作爲屬性屬性?我想它屬於「基元數組」類別,但它是堆分配(引用類型)。 .. – Steztric 2016-11-11 08:29:03

38

specs

該類型的屬性類 位置和命名參數的僅限於該屬性的參數類型,它們是:

  • 其中一個以下類型的:boolbyte,char,double,float,int,long,sbyte, short,stringuintulong,ushort
  • 類型object
  • 類型System.Type
  • 枚舉類型,只要它具有公共可訪問性並且它嵌套的類型(如果有)也具有公共可訪問性(屬性規範)。
  • 上述類型的一維數組。
+9

正確,但請注意您引用了舊版本的規範。在C#版本3.0,4.0和5.0中,聲明它也可以有'sbyte','ushort','uint','ulong'類型。這似乎工作正常。但是仍然不允許使用「decimal」:-( – 2012-09-19 10:56:11

+1

@JeppeStigNielsen我已更新規範鏈接並引用 – 2017-11-25 14:54:29

+0

也不支持可以爲空的基元 – KTCO 2018-02-17 18:02:48

0

這個問題的答案是使用字符串,儘管它不是原子類型,但它仍然可以作爲屬性使用。不要使用雙打,因爲舍入會使結果不準確。

public String MinimumValue 
{ 
    get 
    { 
     return minimumValueDecimal.ToString(); 
    } 

    set 
    { 
     minimumValueDecimal = Decimal.Parse(value); 
    } 
} 

private decimal minimumValueDecimal; 
相關問題