Metalama 2026.1.23
Metalama 2026.1.23 is based on 2026.1.22, plus the following changes.
This release updates Metalama.Compiler to 2026.1.15.
Breaking Changes
- #1844 The symbol of a tuple type with named elements now carries the element names. As a consequence, two tuple types differing only by the names of their elements are no longer equal, at any depth, which affects
Comparers.Default,Comparers.IncludeNullabilityand the structural comparison of twoIRef. Code that means to ask whether one type can be used where the other is expected should useIsConvertibleTowithConversionKind.Identical. - #1846
ConversionKind.Identicalnow reports an identity conversion betweenobjectandobject?, and between two tuples differing only by the names of their elements, as the C# language does. The newConversionKind.Equalrequests the previous, stricter relation.
Fixes
Design time
- #1832 Fixed a design-time crash occurring when the .NET SDK cannot be resolved for a project. Metalama now stops without reporting a diagnostic, leaving the C# compiler to report the condition.
- #1833 Fixed a
TypeLoadExceptionat design time when two Metalama versions are loaded in the same Visual Studio process. An assembly embedded in a Metalama build is now bound to its exact version. - #1848 Fixed a design-time crash that made a project lose all of its Metalama diagnostics and generated documents when a fabric configures hierarchical options on a declaration of another file, or when an aspect adds an annotation to one.
Nullability and tuples in the code model
- #1835 Fixed a build failure reported as
LAMA0001when an[Inheritable]aspect is applied to an open generic type with astructconstraint and another project derives from that type. This was a regression of 2026.1.22, and the audit that followed it produced the items below. - #1837 #1838 Fixed the nullability marker of a
SerializableTypeId, which is now derived from the whole type instead of its outermost position. A value type or an annotated reference type no longer loses the nullability of its type arguments, and the identifier of a type is now the same however it is computed. - #1839 #1845 Fixed the nullability of a type obtained by resolving a
SerializableTypeId: a type argument no longer loses its annotation, and a type resolved from an identifier written in an unannotated context is now oblivious rather than non-nullable. - #1841 Fixed the loss of the tuple element names when a
SerializableTypeIdis resolved. - #1842 Fixed the resolution of the
SerializableTypeIdof a tuple of eight or more elements, which produced aValueTuplethat was not a tuple, or reportedLAMA0020. - #1840 Fixed
ToNullable(),ToNonNullable()andStripNullabilityAnnotation(), which had no effect on a type introduced by an aspect. - #1843 Fixed the
SpecialTypeof a nullable value type built over a type introduced by an aspect, which was reported asNullable_Tinstead ofNone.
Resources
- Milestone
- Full Changelog: release/2026.1.22...release/2026.1.23