Repository navigation
v6.2.1
6.2.1 — 2026-08-16
Fixed
-
⚠️ IsAdjacentToansweredfalsewhenever the receiver was unbounded, and normalization
inherited it. The predicate switched on the receiver's shape and handled only
IFiniteRange<T>; every other shape fell through tofalse. Its inner switch did handle
unbounded operands, so the relation was asymmetric —[1,3].IsAdjacentTo((,0])wastruewhile
(,0].IsAdjacentTo([1,3])wasfalse. PostgreSQL's-|-is symmetric and answerstruefor
both; the XML doc asserted the broken behaviour as if it were intended, which is why reading the
code confirmed it.The consequence was not confined to the predicate.
RangeSet.FromandRangeSet.Unionmerge
neighbours withcurrent.IsAdjacentTo(next)after sorting by lower bound, so an unbounded-start
element is always the receiver and always took the broken direction. Sets were built violating
the invariant they document:RangeSet.From([(,0], [1,)]) was {(,0],[1,)} now {(,)} blocks.Union(blocks.Complement()) was {(,0],[1,)} now the Infinite setTwo sets that should be equal compared unequal depending on how they were built, and a set
covering the whole domain did not equalRangeSet.Infinite. Results change for any range or
set involving an unbounded element adjacent to its neighbour — always from a wrong answer to
the one PostgreSQL gives. Model-versus-server agreement is now pinned by the live suite for
every affected shape pair. Applies to the NodaTime range types, which share the predicate.
Published to nuget.org through Trusted Publishing by this run. The CycloneDX SBOM for each package is attached below.