2009-02-03 9 views
63

Ho cercato di utilizzare valori decimali come parametri per un attributo di campo ma ottengo un errore del compilatore.utilizza valori decimali come parametri di attributo in C#?

Ho trovato questo post sul blog link dicendo che non è stato possibile utilizzare in. Quindi, qualcuno sa perché lo scelgono o come posso utilizzare i parametri decimali?

Grazie.

risposta

92

Questa è una restrizione CLR. Solo le costanti primitive o le matrici di primitive possono essere utilizzate come parametri di attributo. Il motivo per cui un attributo deve essere codificato interamente nei metadati. Questo è diverso da un corpo del metodo che è codificato in IL. L'utilizzo di MetaData limita fortemente l'ambito dei valori che possono essere utilizzati. Nella versione attuale del CLR, i valori dei metadati sono limitati a primitive, null, tipi e matrici di primitive (potrebbe averne perso una minore).

Decimali mentre un tipo di base non è un tipo primitivo e quindi non può essere rappresentato nei metadati che impedisce di essere un parametro di attributo.

+0

Grazie, ho pensato che il decimale fosse un tipo primitivo :-) – rjlopes

+2

Si tratta ancora di un problema con Framework 4.0? e 4.5, 4.6.x? – midspace

+0

@midspace, non proprio un problema, solo una limitazione, imposta dal design. È sfortunato, ma buone possibilità che non possa mai andare via. –

2

Quando ho incontrato questa situazione, ho finito per esporre le proprietà sull'attributo come Double, ma all'interno dell'attributo le ho trattate come Decimal. Lungi dall'essere perfetto, ma per i casi semplici, potrebbe essere proprio quello di cui hai bisogno.

0

È possibile utilizzare il seguente costruttore. Quando si dispone di un valore letterale decimale nel codice C#, il compilatore C# emette una chiamata a questo costruttore.

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

Edit: So che questo non è conveniente.

+1

Se questo ha funzionato in un attributo, allora suppongo che userò anche il suffisso "m", ma neanche lo fa (usando System.ComponentModel.DefaultValueAttribute come mio test) – xr280xr

13

Ho lo stesso problema. Considero di utilizzare le stringhe . Questo non è sicuro per il tipo, ma è leggibile e penso che saremo in grado di scrivere numeri validi nelle stringhe :-).

class BlahAttribute : Attribute 
{ 
    private decimal value; 

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

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

Non è una bellezza, ma dopo aver considerato tutte le opzioni, è abbastanza buono.

+1

Sembra che sia così che mbUnit affronta http: // vkreynin. wordpress.com/2007/05/25/mbunit-24-rtm-now-you-can-use-decimals-in-row-attributes/ –