When a symbolic name for a constant value is desired, but when the type of that value is not permitted in a constant declaration, or when the value cannot be computed at compile-time by a constant-expression, a readonly field (Section 10.4.2) may be used instead.

Annoyingly, this is compounded by the fact that attributes have certain restrictions too - see the C# language spec, §17.2 (again, emphasis mine):

An expression E is an attribute-argument-expression if all of the following statements are true:

The type of E is an attribute parameter type (Section 17.1.3).

At compile-time, the value of E can be resolved to one of the following: