「decimal」が有効な属性パラメータ型ではないのはなぜですか? 質問する

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

なぜ double は OK なのに、decimal はダメなのか、説明できる人はいますか。

ベストアンサー1

これは CLR の制限です。属性パラメータとして使用できるのは、プリミティブ定数またはプリミティブ配列のみです。その理由は、属性はメタデータで完全にエンコードする必要があるためです。これは、IL でコード化されるメソッド本体とは異なります。MetaData を使用すると、使用できる値の範囲が厳しく制限されます。CLR の現在のバージョンでは、メタデータ値はプリミティブ、null、型、およびプリミティブ配列に制限されています (小さな制限が 1 つある可能性があります)。

出典これ回答者ジャレッド・パー

小数は基本型ですがプリミティブ型ではないため、メタデータで表現できず、属性パラメータとして使用できません。

おすすめ記事