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: 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:
null
literal).const
members of class and struct types.+
, –
, !
, and ~
unary operators.+
, –
, *
, /
, %
, <<
, >>
, &
, |
, ^
, &&
, ||
, ==
, !=
, <
, >
, <=
, and =>
binary operators, provided each operand is of a type listed above.?:
conditional operator.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 (§7.5.13).
Constant expressions occur in the contexts listed below. In these contexts, an error occurs if an expression cannot be fully evaluated at compile-time.
case
labels of a switch
statement (§8.7.2).goto
case
statements (§8.9.3).An implicit constant expression conversion (§6.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.