The following table lists C#'s operators in order of precedence.
Operators in the same category have the same precedence.
Category | Operator symbol | Operator name | Example | User overloadable |
---|---|---|---|---|
Primary | . | Member access | x.y | No |
Primary | -> (unsafe) | Pointer to struct | x->y | No |
Primary | () | Function call | x() | No |
Primary | [] | Array/index | a[x] | Via indexer |
Primary | ++ | Post-increment | x++ | Yes |
Primary | -- | Post-decrement | x-- | Yes |
Primary | new | Create instance | new Test() | No |
Primary | stackalloc | Unsafe stack allocation | stackalloc(10) | No |
Primary | typeof | Get type from identifier | typeof(int) | No |
Primary | nameof | Get name of identifier | nameof(x) | No |
Primary | checked | Integral overflow check on | checked(x) | No |
Primary | unchecked | Integral overflow check off | unchecked(x) | No |
Primary | default | Default value | default(char) | No |
Unary | await | Await | await myTask | No |
Unary | sizeof | Get size of struct | sizeof(int) | No |
Unary | ?. | Null-conditional | x?.y | No |
Unary | + | Positive value of | +x | Yes |
Unary | - | Negative value of | -x | Yes |
Unary | ! | Not | !x | Yes |
Unary | ~ | Bitwise complement | ~x | Yes |
Unary | ++ | Pre-increment | ++x | Yes |
Unary | -- | Pre-decrement | --x | Yes |
Unary | () | Cast | (int)x | No |
Unary | * (unsafe) | Value at address | *x | No |
Unary | & (unsafe) | Address of value | &x | No |
Multiplicative | * | Multiply | x * y | Yes |
Multiplicative | / | Divide | x / y | Yes |
Multiplicative | % | Remainder | x % y | Yes |
Additive | + | Add | x + y | Yes |
Additive | - | Subtract | x - y | Yes |
Shift | << | Shift left | x << 1 | Yes |
Shift | >> | Shift right | x >> 1 | Yes |
Relational | < | Less than | x < y | Yes |
Relational | > | Greater than | x > y | Yes |
Relational | <= | Less than or equal to | x <= y | Yes |
Relational | >= | Greater than or equal to | x >= y | Yes |
Relational | is | Type is or is subclass of | x is y | No |
Relational | as | Type conversion | x as y | No |
Equality | == | Equals | x == y | Yes |
Equality | != | Not equals | x != y | Yes |
Logical And | & | And | x & y | Yes |
Logical Xor | ^ | Exclusive Or | x ^ y | Yes |
Logical Or | | | Or | x | y | Yes |
Conditional And | && | Conditional And | x && y | Via & |
Conditional Or | || | Conditional Or | x || y | Via | |
Null coalescing | ?? | Null coalescing | x ?? y | No |
Conditional | ?: | Conditional | isTrue ? thenThis Value : elseThis Value | No |
Assignment & Lambda | = | Assign | x = y | No |
Assignment | *= | Multiply self by | x *= 2 | Via * |
Assignment | /= | Divide self by | x /= 2 | Via / |
Assignment | += | Add to self | x += 2 | Via + |
Assignment | -= | Subtract from self | x -= 2 | Via - |
Assignment | <<= | Shift self left by | x <<= 2 | Via << |
Assignment | >>= | Shift self right by | x >>= 2 | Via >> |
Assignment | &= | And self by | x &= 2 | Via & |
Assignment | ^= | Exclusive-Or self by | x ^= 2 | Via ^ |
Assignment | |= | Or self by | x |= 2 | Via | |
Assignment | => | Lambda | x => x + 1 | No |