9.5.2 Pre-processing expressions Pre-processing expressions can occur in #if and #elif directives. The operators !, ==, !=, && and || are permitted in pre-processing expressions, and parentheses may be used for grouping. pp-expression:: whitespaceopt pp-or-expression whitespaceopt pp-or-expression:: pp-and-expression pp-or-expression whitespaceopt || whitespaceopt pp-and-expression pp-and-expression:: pp-equality-expression pp-and-expression whitespaceopt && whitespaceopt pp-equality-expression pp-equality-expression:: pp-unary-expression pp-equality-expression whitespaceopt == whitespaceopt pp-unary-expression pp-equality-expression whitespaceopt != whitespaceopt pp-unary-expression pp-unary-expression:: pp-primary-expression ! whitespaceopt pp-unary-expression C# LANGUAGE SPECIFICATION 64 pp-primary-expression:: true false conditional-symbol ( whitespaceopt pp-expression whitespaceopt ) When referenced in a pre-processing expression, a defined conditional compilation symbol has the boolean value true, and an undefined conditional compilation symbol has the boolean value false. Evaluation of a pre-processing expression always yields a boolean value. The rules of evaluation for a preprocessing expression are the same as those for a constant expression (§14.15), except that the only user-defined entities that can be referenced are conditional compilation symbols.