Compatibilidad alterada de UnsafeAccessor con genéricos cerrados
.NET 8 introdujo el atributo UnsafeAccessorAttribute, que permite el acceso a miembros no visibles de los tipos (también conocido como "reflexión privada rápida"). No se ha agregado compatibilidad con genéricos en .NET 8 por falta de tiempo. Sin embargo, en CoreCLR y AOT nativo, algunos escenarios muy limitados y no admitidos que implicaban tipos genéricos cerrados sí funcionaban. Estos escenarios deberían haber sido bloqueados, pero, accidentalmente, no lo fueron. Se han agregado nuevas restricciones en .NET 9.
Para obtener más información y ejemplos, consulte las observaciones sobre UnsafeAccessorAttribute.
Comportamiento anterior
En .NET 8, se implementó una búsqueda de firmas en los tipos, y el uso de tipos genéricos se consideró válido en algunos casos. Por ejemplo, el siguiente código se realizó correctamente:
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
extern static void CtorAsMethod(List<int> c);
Comportamiento nuevo
A partir de .NET 9, la forma totalmente compatible y documentada de consumir tipos genéricos es asegurarse de que los parámetros de tipo de un método extern static
coinciden con los parámetros de tipo del método privado, y los parámetros de método de un método extern static
coinciden con los parámetros de método del método privado. Estas restricciones son necesarias porque el runtime realiza una estricta comparación de firmas de metadatos.
class Accessor<T>
{
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
public extern static void CtorAsMethod(List<T> c);
}
Versión introducida
.NET 9 Versión preliminar 6
Tipo de cambio importante
Este es un cambio de funcionamiento.
Motivo del cambio
En la versión oficial de .NET 8, la compatibilidad con el uso de tipos genéricos con UnsafeAccessorAttribute fue involuntaria. Al principio del desarrollo, era un escenario posiblemente compatible, pero posteriormente se aplazó hasta .NET 9 porque el equipo encontró problemas de complejidad. La documentación oficial no mencionaba los genéricos ni proporcionaba ejemplos mediante ellos. Este cambio corrige el comportamiento.
Acción recomendada
Lea la documentación actualizada de la API de UnsafeAccessorAttribute y cambie el código según sea necesario para que coincida con las nuevas restricciones para los tipos genéricos.