本当に信じられないことですが、本当です。このコードは動作しません:
[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 は OK なのに、decimal はダメなのか、説明できる人はいますか。
ベストアンサー1
これは CLR の制限です。属性パラメータとして使用できるのは、プリミティブ定数またはプリミティブ配列のみです。その理由は、属性はメタデータで完全にエンコードする必要があるためです。これは、IL でコード化されるメソッド本体とは異なります。MetaData を使用すると、使用できる値の範囲が厳しく制限されます。CLR の現在のバージョンでは、メタデータ値はプリミティブ、null、型、およびプリミティブ配列に制限されています (小さな制限が 1 つある可能性があります)。
小数は基本型ですがプリミティブ型ではないため、メタデータで表現できず、属性パラメータとして使用できません。