2009-02-03 19 views
63

He estado tratando de usar valores decimales como params para un atributo de campo pero obtengo un error de compilación.¿Usar valores decimales como parámetros de atributo en C#?

Encontré esta publicación en el blog link diciendo que no era posible en .Net usarla entonces, ¿alguien sabe por qué eligen esto o cómo puedo usar parametros decimales?

Gracias.

Respuesta

92

Ésta es una restricción de CLR. Solo las constantes primitivas o matrices de primitivas se pueden usar como parámetros de atributos. La razón es que un atributo debe codificarse completamente en metadatos. Esto es diferente de un cuerpo de método que está codificado en IL. El uso de MetaData solo restringe severamente el alcance de los valores que se pueden usar. En la versión actual del CLR, los valores de metadatos están limitados a primitivos, nulos, tipos y matrices de primitivas (puede haber pasado por alto uno menor).

Decimales mientras que un tipo básico no es un tipo primitivo y, por lo tanto, no se puede representar en los metadatos, lo que impide que sea un parámetro de atributo.

+0

Gracias, pensé que el decimal era un tipo primitivo :-) – rjlopes

+2

¿Sigue siendo un problema con Framework 4.0? y 4.5, 4.6.x? – midspace

+0

@midspace, no es realmente un problema, solo una limitación, impuesta por el diseño. Es desafortunado, pero hay buenas posibilidades de que nunca desaparezca. –

2

Cuando me encontré con esta situación, terminé exponiendo las propiedades en el atributo como Doble, pero dentro del atributo las traté como Decimal. Lejos de ser perfecto, pero para los casos simples, podría ser lo que necesita.

0

Puede usar el siguiente constructor. Cuando tiene un literal decimal en el código C#, el compilador C# emite una llamada a este constructor.

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

Editar: Sé que esto no es conveniente.

+1

Si esto funcionó en un atributo, entonces supongo que usar simplemente el sufijo "m" también lo haría, pero ninguno (utilizando System.ComponentModel.DefaultValueAttribute como prueba) – xr280xr

13

Tengo el mismo problema. Considero usar strings. Esto no es seguro, pero es legible y creo que podremos escribir números válidos en cadenas :-).

class BlahAttribute : Attribute 
{ 
    private decimal value; 

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

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

No es una belleza, pero después de considerar todas las opciones, es lo suficientemente bueno.

+1

Parece que así es como mbUnit hace frente a http: // vkreynin. wordpress.com/2007/05/25/mbunit-24-rtm-now-you-can-use-decimals-in-row-attributes/ –

Cuestiones relacionadas