ECMA-334 C# Language Specification14.15: Constant expressions |
A constant-expression
is an expression that can be fully evaluated at compile-time.
expression
The type of a constant expression can be one of the following: sbyte , byte , short , ushort , int , uint , long , ulong , char , float , double , decimal , bool , string, any enumeration type, or the null type. The following constructs are permitted in constant expressions:
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 (14.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.
An implicit constant expression conversion (13.1.6) permits a constant expression of type int to be converted to sbyte , byte , short , ushort , uint , or ulong , provided the value of the constant expression is within the range of the destination type.