Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
.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 и измените код в соответствии с новыми ограничениями для универсальных типов.