Strictly speaking you can not, since the constellation can only be applied to a field or local whose value is known at compile time.
In both the lines below, the right-hand is not a constant expression (not in C#).
- const int [] constIntArray = newint [] {2, 3, 4};
- // error CS0133: The expression being assigned to 'constIntArray' must be constant
- const int [] constIntArrayAnother = {2, 3, 4};
- // error CS0623: Array initializers can only be used in a variable or field
- // initializer. Try using a new expression instead.
However, there are some workarounds, depending on what it is you want to achieve.
If want a proper .NET array (System.Array) that cannot be reassigned, then static readonly will do for you.
static readonly int [ ] constIntArray = new int[] {1, 2, 3};
The constIntArray field will be initialized before it its first use.
If, however, requires a constant set of values (such as an argument to an attribute constructor), then - if you may be limited to integral types - an enum would serve well.
For example:
- [Flags]
- public enum Role
- {
- Administrator = 1,
- BackupOperator = 2,
- // etc.
- }
- public class RoleAttribute : Attribute
- {
- public RoleAttribute()
- {
- CreateRole = DefaultRole;
- }
- public RoleAttribute(Role role)
- {
- CreateRole = role;
- }
- public Role CreateRole
- {
- get { return this.createRole; }
- set { this.createRole = value; }
- }
- private Role createRole = 0;
- public const Role DefaultRole = Role.Administrator
- | Role.BackupOperator;
- }
- [RoleAttribute(RoleAttribute.DefaultRole)]
- public class DatabaseAccount
- {
- //..............
- }
RoleAttribute, instead of taking a series, only have a single argument of the flags (appropriately or-ed). If the underlying type of the list is long or ulong paper, which offers 64 different functions.
1 comments: