SA1407: Arithmetic, bitwise, and shift expressions should declare precedence
Cause
A C# statement contains a complex expression with arithmetic, bitwise, or shift operators which omits parenthesis to make precedence explicit.
Rule description
C# maintains a hierarchy of precedence for arithmetic, bitwise, and shift operators. It is possible in C# to string multiple operations together in one statement without wrapping any of the operations in parenthesis, in which case the compiler will automatically set the order and precedence of the operations based on these pre-established rules. For example:
int x = 5 + y * b / 6 % z - 2;
Although this code is legal, it is not highly readable or maintainable. In order to achieve full understanding of this code, the developer must know and understand the basic operator precedence rules in C#.
This rule is intended to increase the readability and maintainability of this type of code, and to reduce the risk of introducing bugs later, by forcing the developer to insert parenthesis to explicitly declare the operator precedence. The example below shows multiple arithmetic operations surrounded by parenthesis:
int x = 5 + (y * ((b / 6) % z)) - 2;
Inserting parenthesis makes the code more obvious and easy to understand, and removes the need for the reader to make assumptions about the code. This rule also applies to bitwise &, |, and ^ operators and to <<, >>, and >>> shift operators.
How to fix violations
To fix a violation of this rule, insert parenthesis within the expression to declare the precedence of the operations.
How to suppress violations
[SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1407:ArithmeticExpressionsMustDeclarePrecedence", Justification = "Reviewed.")]
#pragma warning disable SA1407 // ArithmeticExpressionsMustDeclarePrecedence
#pragma warning restore SA1407 // ArithmeticExpressionsMustDeclarePrecedence