次の方法で共有


クローズド ジェネリックに対する UnsafeAccessor のサポートが変更されました

.NET 8 では、UnsafeAccessorAttribute 属性が導入されました。この属性を使用すると、参照できない型のメンバー (別名 "高速プライベート リフレクション") にアクセスできます。 時間的な制約があり、.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 Preview 6

破壊的変更の種類

この変更は、動作変更です。

変更理由

公式の .NET 8 リリースでは、UnsafeAccessorAttribute でのジェネリック型の使用のサポートは意図したものではありませんでした。 開発の初期段階では、サポートされる可能性のあるシナリオでしたが、チームが複雑な問題を確認したため、その後 .NET 9 まで延期することにしました。 公式ドキュメントではジェネリックについては言及されておらず、ジェネリックを使用した例も提供されていませんでした。 今回の変更で、この動作が修正されます。

UnsafeAccessorAttribute API の更新されたドキュメントをご覧になり、ジェネリック型の新しい制限に合わせる必要がある場合は、必要に応じてコードを変更してください。

影響を受ける API