Drop the parentheses from the case false of value sets

Applies NKarolak's review suggestion: a case value set needs no parentheses
around a comparison.

Encodes the rationale in the Best Practice section, since it is a real
advantage of the pattern and is not documented elsewhere in the repo. The AL
operator hierarchy places and/xor above the comparison operators and or just
above them too, so parentheses are mandatory in an and chain — A = B and
C = D misparses without them — while a case value set has no and to bind
tighter and needs none. That inverts the precedence most developers arrive
with from C#.

Also notes in the bad sample that its parentheses are not optional, so the
two samples contrast on parentheses as well as on evaluation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
António Silva 2026-08-27 10:31:00 +01:00
parent 580970ac12
commit 0d5150c47b
3 changed files with 7 additions and 6 deletions

View file

@ -8,11 +8,11 @@ codeunit 50542 "Perf Sample CaseChain Good"
// so each condition is reached only when the previous one passed — and
// Item.Get is never called for a non-item line.
case false of
(SalesLine.Type = SalesLine.Type::Item),
(SalesLine."No." <> ''),
(SalesLine."Qty. to Ship" > 0),
SalesLine.Type = SalesLine.Type::Item,
SalesLine."No." <> '',
SalesLine."Qty. to Ship" > 0,
Item.Get(SalesLine."No."),
(not Item.Blocked):
not Item.Blocked:
exit(false);
end;
exit(true);