Skip to content

Metalama 2026.1.23

Choose a tag to compare

@gfraiteur gfraiteur released this 10 Aug 08:37

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.IncludeNullability and the structural comparison of two IRef. Code that means to ask whether one type can be used where the other is expected should use IsConvertibleTo with ConversionKind.Identical.
  • #1846 ConversionKind.Identical now reports an identity conversion between object and object?, and between two tuples differing only by the names of their elements, as the C# language does. The new ConversionKind.Equal requests 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 TypeLoadException at 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 LAMA0001 when an [Inheritable] aspect is applied to an open generic type with a struct constraint 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 SerializableTypeId is resolved.
  • #1842 Fixed the resolution of the SerializableTypeId of a tuple of eight or more elements, which produced a ValueTuple that was not a tuple, or reported LAMA0020.
  • #1840 Fixed ToNullable(), ToNonNullable() and StripNullabilityAnnotation(), which had no effect on a type introduced by an aspect.
  • #1843 Fixed the SpecialType of a nullable value type built over a type introduced by an aspect, which was reported as Nullable_T instead of None.

Resources