2010-07-07 426 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; 
相关问题