Strictly speaking you can't, since const 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, on the other hand, you really need a const set of values (say as an argument to an attribute constructor), then - if you can limit yourself to integral types - an enum would serve you 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 an array, would only take a single argument of flags (appropriately or-ed). If the underlying type of the Role enum is long or ulong, that gives you 64 different Roles.
Comments