Arithmetic / bitwise / comparison
✅
integer division truncates; %, shifts, & | ^ ~ native; checked(expr) throws OverflowException, unchecked(expr) wraps to 32 bits (\| 0/>>> 0). Default-context int overflow does not wrap (JS float64).
Math.*
✅
Truncate→trunc, Ceiling→ceil, Round banker's via round helper
decimal
✅
exact via Decimal (literals + + - * / == != < > <= >=)
Numeric constants
✅
int.MaxValue, double.Epsilon, … → literals
Parsing / Convert.*
✅
int/double.Parse, bool.Parse, Convert.ToInt32/ToDouble/ToString/ToBoolean/…
Strings
✅
Substring/IndexOf/Replace/Split/Pad/Trim(char)/Concat/Format/Join/IsNullOrEmpty/IsNullOrWhiteSpace; StringComparison-aware Equals/StartsWith/EndsWith/Contains/IndexOf (Ordinal + IgnoreCase). Culture-sensitive ordering (CompareTo) is out of scope.
char.*
✅
ToUpper/ToLower/IsDigit/IsLetter/IsWhiteSpace/… (Unicode-aware)
StringBuilder
✅
compat type: Append(incl. bool→"True"/"False")/AppendLine("\n")/Insert/Remove/Replace/Clear/Length/ToString
LINQ
✅
Where/Select/SelectMany/Where-Select(indexed)/OrderBy/Distinct(By)/GroupBy/ToDictionary/ToLookup/Zip/Chunk/MinBy/MaxBy/Take(While)/Skip(While)/Aggregate/Sum/Min/Max/Average/Count/Any/All/First/Last/Concat/Reverse/Join/GroupJoin/ThenBy/ThenByDescending (Join/GroupJoin = order-preserving hash join over primitive keys; OrderBy+ThenBy = single stable composite sort, source copied). IGrouping from GroupBy/ToLookup is usable as a sequence (iterate, g.Select/g.Sum/g.Count()) and exposes g.Key; ILookup [key] indexer is not modelled.
Collections
✅
List, Dictionary, HashSet (incl. initializers and .Count); Queue/Stack/LinkedList compat; sorted family SortedSet/SortedDictionary/SortedList (key-sorted enumeration). Record/struct/tuple-keyed dictionaries route to $eq.collections.valueMap (structural keys: construction, d[k] get/set, ContainsKey/Add/Remove/Clear/TryGetValue/GetValueOrDefault, Keys/Values/Count, foreach); string/number/enum-keyed dictionaries keep the plain-object form. ILookup[key] indexer returns the group (or empty for an absent key).
enum
✅
member-name string (equality/switch/ternary)
long/ulong
✅
exact via BigInt (long helper); literals 5L→5n, wire as JSON string
DateTime
✅
tick-precise DateTime compat type: ctors, components, Add*, -→TimeSpan, comparisons, .ToString()/format; ISO-8601 wire + hydration
TimeSpan
✅
tick-precise TimeSpan compat type: From*, ctors, components/totals, + -, comparisons, .NET "c" .ToString(); "c" wire + hydration
DateOnly / TimeOnly
✅
compat types (.NET 6+): ctors, components, Add*(+ TimeOnly wrap), comparisons, invariant .ToString() (MM/dd/yyyy / HH:mm); ISO wire + hydration
DateTimeOffset
✅
tick-precise compat type (wall-clock + offset, compared by the instant): ctors, components, Offset/UtcDateTime/LocalDateTime, ToOffset, Add*, From/ToUnixTime*, - →TimeSpan, instant comparisons, invariant .ToString() (MM/dd/yyyy HH:mm:ss zzz); ISO+offset wire + hydration
record / struct / value tuple
✅
Value semantics. Records/structs are plain objects (positional new Point(1,2) → {x,y}, object initializers merge), tuples are arrays with element access by position (t.Item1) and by declared name ((int X, int Y).X) → index. ==/!=, .Equals, Contains, Distinct compare structurally via $eq.equals; with copies-and-replaces. Deconstruction var (a, b) = … works for tuples (array destructuring, discard holes) and records (object destructuring by Deconstruct order). Records emit as named JS classes carrying their user instance methods + a structural equals, prototype-preserving with, and .NET toString; value semantics are unchanged. The build pipeline discovers records by scanning and emits each as its own module; components that reference a record import it automatically (reactive, no hardcoded list). SSR values are re-hydrated back into the record class on the client (recursively, restoring nested records and compat members), so methods/instanceof survive. Covers positional and body records and plain structs (object-initializer construction maps to the constructor by member order, with per-member defaults), plus record inheritance (extends + super) and generic records (type args erased). Record-keyed dictionaries (Dictionary<RecordKey, V>) route to $eq.collections.valueMap so equal-by-value keys collide as in .NET.
Nullable<T> (T?)
✅
HasValue/Value, GetValueOrDefault() (type-aware default: 0/false/$eq.num.dec(0)/enum zero-member/…) and GetValueOrDefault(fallback), ??; lifted operators via $eq.nullable.*: arithmetic propagates null, relational (< > <= >=) is false when either side is null (not a numeric coercion). No-arg GetValueOrDefault() on DateTime?/Guid?/struct yields null, so use the fallback form there.
Guid
✅
Guid.NewGuid()→crypto.randomUUID(), Guid.Empty, Guid.Parse; string wire