Почему "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 в порядке, а decimal-нет.

689   3  

3 ответов:

это ограничение среды CLR. Только примитивные константы или массивы примитивы могут использоваться в качестве атрибута параметры. Причина, почему это так атрибут должен быть полностью закодирован в метаданные. Это отличается от тело метода, которое кодируется в IL. Использование метаданных только сильно ограничивает область значений, которые можно использовать. В текущей версии среды CLR, значения метаданных ограничены примитивы, null, типы и массивы примитивы (может иметь пропустил несовершеннолетнего один.)

принято от этой ответ JaredPar.

десятичные знаки, в то время как базовый тип не является примитивный тип, и, следовательно, не может быть представлен в метаданных, которые предотвращают это от того, чтобы быть параметром атрибута.

С технические характеристики:

типы позиционных и именованных параметров для класса атрибута ограничены типами параметров атрибута, которые являются:

  • один из следующих типов: bool,byte,char,double,float,int,long,sbyte,short,string,uint,ulong,ushort.
  • тип object.
  • тип System.Type.
  • тип перечисления, при условии, что он имеет общедоступный доступ и типы, в которые он вложен (если таковые имеются), также имеют общедоступный доступ (спецификация атрибутов).
  • одномерные массивы вышеуказанных типов.

ответ на эту проблему заключается в использовании строк, которые разрешены в качестве атрибутов, несмотря на то, что не являются атомарным типом. Не используйте двойники, так как округление сделает результаты менее точными.

public String MinimumValue
{
    get
    {
        return minimumValueDecimal.ToString();
    }

    set
    {
        minimumValueDecimal = Decimal.Parse(value);
    }
}

private decimal minimumValueDecimal;

Comments

    Ничего не найдено.