The C# team posts answers to common questions and describes new language features
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. [Author: SantoshZ]
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};
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.
[Author: SantoshZ]
The following code compiles with no problem:
const int[] constArray = null;
constArray[0] = 1;
how about...
public static string[] myARRstr()
{
string[] ccccc= { "aaaaa", "bbbbbb" };
return cccc;
}
i did like it the last one, optimized as:
return new string[] { "aaaaa", "bbbbbb" };