为什么“小数”不是一个有效的属性参数types?

这是真的令人难以置信,但真实。 这段代码将不起作用:

[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; } } 

谁能告诉我为什么double是好的,而decimal不是。

这是一个CLR限制。 只有基本常量或基元数组可以用作属性参数。 原因是一个属性必须完全在元数据中进行编码。 这与在IL中编码的方法主体不同。 使用MetaData只能严格地限制可以使用的值的范围。 在CLR的当前版本中,元数据值仅限于基元,null,types和基元数组(可能错过了次要元素)。

JaredPar从这个答案采取。

而基本types的小数不是原始types,因此不能在元数据中表示,从而防止它成为属性参数。

从规格 :

属性类的位置和命名参数的types仅限于属性参数types,它们是:

  • 以下types之一:bool,byte,char,double,float,int,long,short,string,sbyte,ushort,uint,ulong。
  • types对象。
  • typesSystem.Type。
  • 一个枚举types,只要它具有公共可访问性,嵌套types(如果有的话)也具有公共可访问性(见17.2节)。
  • 上述types的一维数组。