7.15 Constant expressions
A constant-expression is an expression that can be fully evaluated at compile-time.
The type of a constant expression can be one of the following:
string, any enumeration type, or the null type. The following constructs are permitted in constant expressions:
- Literals (including the
- References to
constmembers of class and struct types.
- References to members of enumeration types.
- Parenthesized sub-expressions, which are themselves constant expressions.
- Cast expressions, provided the target type is one of the types listed above.
- The predefined
- The predefined
>=binary operators, provided each operand is of a type listed above.
Whenever an expression is of one of the types listed above and contains only the constructs listed above, the expression is evaluated at compile-time. This is true even if the expression is a sub-expression of a larger expression that contains non-constant constructs.
The compile-time evaluation of constant expressions uses the same rules as run-time evaluation of non-constant expressions, except that where run-time evaluation would have thrown an exception, compile-time evaluation causes a compile-time error to occur.
Unless a constant expression is explicitly placed in an
unchecked context, overflows that occur in integral-type arithmetic operations and conversions during the compile-time evaluation of the expression always cause compile-time errors (Section 7.5.12).
Constant expressions occur in the contexts listed below. In these contexts, a compile-time error occurs if an expression cannot be fully evaluated at compile-time.
- Constant declarations (Section 10.3).
- Enumeration member declarations (Section 14.3).
caselabels of a
switchstatement (Section 8.7.2).
casestatements (Section 8.9.3).
- Dimension lengths in an array creation expression (Section 22.214.171.124) that includes an initializer.
- Attributes (Section 17).
An implicit constant expression conversion (Section 6.1.6) permits a constant expression of type
int to be converted to
ulong, provided the value of the constant expression is within the range of the destination type.