2009-02-03 4 views
63

Я пытаюсь использовать десятичные значения в качестве параметров для атрибута поля, но я получаю ошибку компилятора.использовать десятичные значения в качестве атрибутов params в C#?

Я нашел это сообщение в блоге link, говоря, что это невозможно в .Net, чтобы использовать тогда, кто-нибудь знает, почему они выбирают это или как я могу использовать десятичные параметры?

Спасибо.

ответ

92

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

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

+0

Спасибо, я думал, что десятичный был примитивным типом :-) – rjlopes

+2

Это еще проблема с Framework 4.0? и 4.5, 4.6.x? – midspace

+0

@midspace, не проблема, просто ограничение, навязанное дизайном. Это печально, но хорошие шансы, что он никогда не исчезнет. –

1

Для трюков в реальном времени с атрибутами я использую класс TypeConverter.

2

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

0

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

Decimal(Int32, Int32, Int32, Boolean, Byte)

Edit: Я знаю, что это не очень удобно.

+1

Если это сработало в атрибуте, то я предполагаю, что просто использовать суффикс «m» тоже, но также и (используя System.ComponentModel.DefaultValueAttribute в качестве моего теста) – xr280xr

13

У меня такая же проблема. Я считаю, что использовать строки. Это не безопасно для типов, но оно читаемо, и я думаю, что мы сможем писать допустимые числа в строках :-).

class BlahAttribute : Attribute 
{ 
    private decimal value; 

    BlahAttribute(string number) 
    { 
    value = decimal.Parse(number, CultureInfo.InvariantCulture); 
    } 
} 

[Blah("10.23")] 
class Foo {} 

Это не красота, но, рассмотрев все варианты, это достаточно хорошо.

+1

Похоже, что вот как mbUnit справляется с http: // vkreynin. wordpress.com/2007/05/25/mbunit-24-rtm-now-you-can-use-decimals-in-row-attributes/ –