Изменена поддержка unsafeAccessor для закрытых универсальных шаблонов

.NET 8 представил UnsafeAccessorAttribute атрибут, который позволяет получить доступ к невидимым элементам типов (AKA "быстрое частное отражение"). Поддержка универсальных шаблонов в .NET 8 не была добавлена из-за ограничений времени. Однако в CoreCLR и собственном AOT некоторые очень узкие и неподдерживаемые сценарии с участием закрытых универсальных типов работали. Эти сценарии должны были быть заблокированы, но непреднамеренно не были. Новые ограничения добавлены в .NET 9.

Дополнительные сведения и примеры см. в примечаниях для UnsafeAccessorAttribute.

Прежнее поведение

В .NET 8 была реализована наивная проверка подписи типов, и использование универсальных типов в некоторых случаях считается допустимым. Например, следующий код выполнен успешно:

[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
extern static void CtorAsMethod(List<int> c);

Новое поведение

Начиная с .NET 9, полностью поддерживаемый и документизированный способ использования универсальных типов заключается в том, чтобы параметры типа метода соответствовали параметрам типа extern static частного метода, а параметры extern static метода соответствуют параметрам метода частного метода. Эти ограничения необходимы, так как среда выполнения выполняет строгое соответствие подписи метаданных.

class Accessor<T>
{
    [UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
    public extern static void CtorAsMethod(List<T> c);
}

Представленные версии

.NET 9( предварительная версия 6)

Тип критического изменения

Это изменение поведения.

Причина изменения

В официальном выпуске .NET 8 поддержка использования универсальных типов с UnsafeAccessorAttribute непреднамеренным. На раннем этапе разработки это был, возможно, поддерживаемый сценарий, но позже был отложен до .NET 9, так как команда столкнулась с проблемами сложности. Официальная документация не упоминала универсальные шаблоны, а также не предоставляла примеры использования универсальных шаблонов. Это изменение исправляет поведение.

Ознакомьтесь с обновленной документацией по UnsafeAccessorAttribute API и измените код в соответствии с новыми ограничениями для универсальных типов.

Затронутые API