1. ホーム
  2. c#

[解決済み] なぜ "decimal "は有効な属性パラメータタイプではないのですか?

2022-04-27 07:21:02

質問

本当に信じられないことなのですが、現実です。このコードは動作しません。

[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はダメなのか、わかる人教えてください。

どのように解決するのですか?

<ブロッククオート

これはCLRの制限です。以下のもののみ プリミティブ定数または プリミティブは属性として使用することができます。 パラメータになります。その理由は 属性は、すべて メタデータを使用します。これは メソッド本体はILでコード化されています。 MetaDataを使用すると、以下のような厳しい制限があります。 というのは、使用できる値の範囲が決まっているからです。 現在のCLRのバージョンでは メタデータの値は、以下のものに限られます。 のプリミティブ、NULL、型、配列。 プリミティブ(マイナーなものを見逃している可能性があります の1つ)。

より引用 これ 回答者 ジャレドパー .

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