c #: ¿Qué es una expresión constante?

Estoy trabajando con atributos en este momento. A menudo me encuentro con el error ‘Un argumento de atributo debe ser una expresión constante, tipo de expresión o expresión de creación de matriz de un tipo de parámetro de atributo’. Realmente no sé lo que significa ‘expresión constante’.

Habría sido realmente útil poder pasar un Func al atributo (para ser consumido por el código que se ejecuta cuando el atributo está presente). Pero ay, no. No entiendo por qué ese tipo no se puede colocar en metadatos de ensamblaje, lo que supongo que es la razón por la que no puedo pasarlo al atributo.

puede alguien darme alguna idea?

El comstackdor debe poder crear los Atributos en el momento de la comstackción, ya que están incrustados en su ensamblaje con sus datos reales (son creados por el comstackdor y serializados en el archivo de salida). Por eso necesitas una expresión constante.

Básicamente, puedes usar todos los tipos de datos básicos (como int , bool , string , etc.). También puede usar expresiones de tipo de letra porque se resolverán en tokens de metadatos que identifican un tipo, lo que está bien en el momento de la comstackción.

Quizás pueda poner el concepto de su Func en una interfaz que implementan sus tipos. O en una clase de controlador independiente que puede pasar a su atributo utilizando una expresión typeof(MyHandlerClass) .

Las expresiones constantes son valores determinados únicamente en tiempo de comstackción, incluida la concatenación de cadenas de otras expresiones constantes, aritmética, etc.

Entonces, por ejemplo, “” es una expresión constante, pero String.Empty no lo es.

String es el único tipo de referencia que admite una expresión constante no nula. Para los tipos de valor, los tipos primitivos ( int etc.) y decimal expresiones constantes de soporte de decimal … aunque no puede usar decimal en los atributos, ya que no es un primitivo en el CLR. (Ni siquiera se puede especificar decimal como un tipo de parámetro en un constructor de atributos).

Consulte la sección 7.19 de la especificación C # 4 para obtener más información.

Los atributos en C# son artefactos de tiempo de comstackción , por lo que para ser creados tienen que tener un tipo constante de parámetros / marcadores / lo que sea …

Hay posibles bashs de hacer lo que usted es, supongo, va a hacer:

Atributos dynamics en C #

Una expresión constante es una expresión que se puede evaluar completamente en tiempo de comstackción.

http://msdn.microsoft.com/en-us/library/aa691319(v=vs.71).aspx (artículo anterior pero aún válido)