为什么“小数”不是一个有效的属性参数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的一维数组。